ResultPath - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

ResultPath

状态的输出可以是其输入的副本、其生成的结果(例如,Task 状态的 Lambda 函数的输出)或其输入和结果的组合。使用 ResultPath 可控制传递到状态输出的上述两种内容的组合。

以下状态类型可以生成结果且包含 ResultPath:

使用 ResultPath 可将任务结果与任务输入组合,或可选择二者之一。提供给 ResultPath 的路径控制将传递到输出的信息。

注意

ResultPath 限制为使用限制范围的引用路径,以便它可以仅标识 JSON 中的单一节点。请参阅 引用路径Amazon 状态语言中的

这些示例基于中所述的状态机和 Lambda 函数创建 Step Functions 状态Machine使用 Lambda教程。演练此教程并通过在 ResultPath 字段中尝试不同的路径来测试不同的输出。

提示

使用Step Functions 控制台中的数据流模拟器来测试 JSON 路径语法,以更好地了解数据在状态中是如何操作的、并查看数据是如何在状态之间传递的。

使用 ResultPath 将输入替换为结果

如果没有指定 ResultPath,则默认行为是已指定 "ResultPath": "$"。由于这将指示状态将整个输入替换为结果,因此状态输入将由来自任务结果的结果完全替换。

下图显示了 ResultPath 如何将输入完全替换为任务的结果。


        将输入替换为 ResultPath。

使用状态机和 Lambda 函数创建 Step Functions 状态Machine使用 Lambda,如果我们传递以下输入:

{ "comment": "This is a test of the input and output of a Task state.", "details": "Default example", "who": "AWS Step Functions" }

Lambda 函数提供以下结果。

"Hello, AWS Step Functions!"

如果ResultPath状态中未指定,或者如果"ResultPath": "$"已设置,则状态的输入将由 Lambda 函数的结果取代,并且状态的输出为以下内容。

"Hello, AWS Step Functions!"
注意

ResultPath 用于包含结果内容与输入,然后再将其传递到输出。但是,如果未指定 ResultPath,则默认为替换整个输入。

丢弃结果并保留原始输入

如果将 ResultPath 设置为 null,它会将原始输入传递给输出。使用 "ResultPath": null 时,状态的输入有效负载将直接复制到输出中,而不考虑结果。

下图显示了 null ResultPath 如何将输入直接复制到输出。


        使用 ResultPath 将输入复制到输出。

使用 ResultPath 将结果包含在输入中

下图显示了 ResultPath 如何包含结果与输入。


        包含输入与 ResultPath

如果使用中所述的状态机和 Lambda 函数,则使用创建 Step Functions 状态Machine使用 Lambda教程中,我们可以传递以下输入。

{ "comment": "This is a test of the input and output of a Task state.", "details": "Default example", "who": "AWS Step Functions" }

Lambda 函数的结果为以下内容。

"Hello, AWS Step Functions!"

要保留输入,请插入 Lambda 函数的结果,然后将组合的 JSON 传递到下一个状态,我们可以将设置ResultPath更改为以下内容。

"ResultPath": "$.taskresult"

这包括 Lambda 函数的结果与原始输入。

{ "comment": "This is a test of input and output of a Task state.", "details": "Default behavior example", "who": "AWS Step Functions", "taskresult": "Hello, AWS Step Functions!" }

Lambda 函数的输出将作为taskresult。输入(包括新插入的值)将传递到下一个状态。

还可以将结果插入输入的子节点。将 ResultPath 设置为以下内容。

"ResultPath": "$.strings.lambdaresult"

使用以下输入开始执行。

{ "comment": "An input comment.", "strings": { "string1": "foo", "string2": "bar", "string3": "baz" }, "who": "AWS Step Functions" }

Lambda 函数的结果将作为strings节点。

{ "comment": "An input comment.", "strings": { "string1": "foo", "string2": "bar", "string3": "baz", "lambdaresult": "Hello, AWS Step Functions!" }, "who": "AWS Step Functions" }

状态输出现在包含原始输入 JSON 与作为子节点的结果。

使用 ResultPath 将输入中的节点更新为结果

下图显示了 ResultPath 如何将输入中现有 JSON 节点的值更新为任务结果中的值。


        将输入替换为 ResultPath

如果使用中所述的状态机和 Lambda 函数的示例,则使用创建 Step Functions 状态Machine使用 Lambda教程中,我们可以传递以下输入。

{ "comment": "This is a test of the input and output of a Task state.", "details": "Default example", "who": "AWS Step Functions" }

Lambda 函数的结果为以下内容。

Hello, AWS Step Functions!

我们可覆盖现有节点,从而代替保留输入和将结果作为新节点插入 JSON。

例如,正如忽略或设置 "ResultPath": "$" 可覆盖整个节点一样,您可以指定单个节点来覆盖结果。

"ResultPath": "$.comment"

由于comment节点已存在于状态输入中,设置ResultPath"$.comment"将使用 Lambda 函数的结果替换输入中的节点。如果未按 OutputPath 进一步筛选,则以下信息将传递到输出。

{ "comment": "Hello, AWS Step Functions!", "details": "Default behavior example", "who": "AWS Step Functions", }

的值comment节点、"This is a test of the input and output of a Task state."、、和均由 Lambda 函数的结果取代:"Hello, AWS Step Functions!"在状态输出中。

使用 ResultPath 在 Catch 中包含错误和输入

使用 Step Functions 状态机处理错误情形教程演示如何使用状态机捕获错误。在某些情况下,您可能希望保留原始输入与错误。在 Catch 中使用 ResultPath 可包含错误与原始输入,而不是替换它。

"Catch": [{ "ErrorEquals": ["States.ALL"], "Next": "NextTask", "ResultPath": "$.error" }]

如果上一 Catch 语句捕获错误,则它将在状态输入的 error 节点中包含结果。例如,对于以下输入:

{"foo": "bar"}

捕获错误时,状态输出为以下内容。

{ "foo": "bar", "error": { "Error": "Error here" } }

有关错误处理的更多信息,请参阅以下内容: