NodeJS AWS阶跃函数:函数.length()在处于Choice状态的变量字段中返回错误

bpzcxfmw  于 2023-02-18  发布在  Node.js
关注(0)|答案(3)|浏览(118)

我在AWS步骤函数中有一个选择状态,它将比较输入的数组长度,并决定进入下一个状态。
但是,length()函数在获取数组长度时返回了一个错误:
{
“错误”:“状态.运行时间”,
“原因”:“执行状态'CheckItemsCountState'(在事件ID #18处输入)时出错。无效路径'$.Metadata[2].Items.length()':选择状态的条件路径引用了无效值。”
}
选择状态的定义如下:

"CheckItemsCountState":{  
         "Type": "Choice",
         "InputPath": "$",
         "OutputPath": "$",
         "Default": "NoItemsState",
         "Choices":[  
            {  
               "Variable": "$.Metadata[2].Items.length()",
               "NumericGreaterThan": 0,
               "Next": "ProcessState"
            }
         ]
      },

该状态连接其他状态,返回JSON,JSON如下所示:

{
  "Metadata": [
    {
      "foo": "name"
    },
    {
      "Status": "COMPLETED"
    },
    {
      "Items": []
    }
  ]
}

所以我试着在Metadata[2]中得到Items的长度,如果值大于0,就进行比较。
我尝试验证此website中的JsonPath $.Metadata[2].Items.length(),但它返回0。
我不确定我是否错过了什么,我在AWS Step Function的文档或示例中找不到任何关于在jsonpath中使用函数的信息。
我将感激你的帮助。谢谢!

u59ebvdq

u59ebvdq1#

步骤函数不允许您使用函数获取值。从选择规则文档中:
对于这些运算符中的每一个,对应的值必须为适当的类型:字符串、数字、布尔值或时间戳。
要执行您所要求的操作,您需要在前面的函数中获取数组长度,并将其作为输出的一部分返回。

{
  "Metadata": [
    {
      "foo": "name"
    },
    {
      "Status": "COMPLETED"
    },
    {
      "Items": [],
      "ItemsCount": 0
    }
  ]
}

然后在步骤功能选择步骤中:

"CheckItemsCountState":{  
    "Type": "Choice",
    "InputPath": "$",
    "OutputPath": "$",
    "Default": "NoItemsState",
    "Choices":[  
        {  
            "Variable": "$.Metadata[2].ItemsCount",
            "NumericGreaterThan": 0,
            "Next": "ProcessState"
        }
    ]
},
nxagd54h

nxagd54h2#

一种可能的方法是检查零索引,如果你只想检查它是一个非空数组。
你可以做这样的事

"CheckItemsCountState":{  
     "Type": "Choice",
     "InputPath": "$",
     "OutputPath": "$",
     "Default": "NoItemsState",
     "Choices":[
       {
         "And": [
           {
            "Variable": "$.Metadata[2].Items",
            "IsPresent": true
           },
           {
             "Variable": "$.Metadata[2].Items[0]",
             "IsPresent": true
           }
         ],
        "Next": "ProcessState"
       }
     ]
  }

另一种方法是在接受的答案中提到的,在前面的函数中设置计数。

atmip9wb

atmip9wb3#

AWS阶跃函数增加了14个内在函数,包括States.ArrayLength,将解决此问题:https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-intrinsic-functions.html#asl-intrsc-func-arrays
例如,给定以下输入数组:

{
   "inputArray": [1,2,3,4,5,6,7,8,9]
}

可以使用States.ArrayLength返回inputArray的长度:

"length.$": "States.ArrayLength($.inputArray)"

在本例中,States.ArrayLength将返回以下JSON对象,该对象表示数组长度:

{ "length": 9 }

相关问题