分配消息运行时错误问题排查

<ph type="x-smartling-placeholder"></ph> 您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

UnresolvedVariable

错误代码

steps.assignmessage.UnresolvedVariable

错误响应正文

{
    "fault": {
        "faultstring": "AssignMessage[policy_name]: unable to resolve variable [variable_name]",
        "detail": {
            "errorcode": "steps.assignmessage.UnresolvedVariable"
        }
    }
}

原因

如果分配消息政策中指定的变量为以下任一项,就会出现此错误:

  • 超出范围(在执行政策的特定流中不可用)
  • 无法解析(未定义)

例如,如果在请求流中执行分配消息政策,但 <Copy> 元素中的 source 属性被设为 responseerror 变量或请求流中不存在的任何其他自定义变量,就会出现此错误。

诊断

  1. 找出发生错误的分配消息政策以及不可用的变量名称。您可以在错误响应的 faultstring 元素中找到这两项。

    例如,在以下 faultstring 中,政策名称为 googleBook,变量为 var

    "faultstring": "AssignMessage[googleBook]: unable to resolve variable var"
    
  2. 在失败的分配消息政策 XML 中,验证所用变量名称是否与故障字符串中标识的变量名称(上文第 1 步中)相匹配。例如,以下政策将 <Copy> 元素中的来源特性设置为名为 var 的变量,该变量与 faultstring 中的内容匹配:

    <AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
       <DisplayName>googleBook</DisplayName>
       <Properties />
       <Copy source="var">
          <Headers>
             <Header name="user-agent" />
          </Headers>
       </Copy>
       <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
       <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
    </AssignMessage>
    
  3. 确定变量是否已定义,以及在执行分配消息政策的流中是否可用。

  4. 如果该变量:

    1. 超出范围(在执行政策的特定流中不可用)
    2. 无法解析(未定义)

    就会导致错误。

    例如,假设上述分配消息政策在请求流中执行。检查变量 var 是否是在请求流中的分配消息政策之前执行的任何政策中定义。如果该变量未定义,您将收到错误代码:

    steps.assignmessage.UnresolvedVariable
    

解决方法

确保政策中引用的变量存在,并且在执行分配消息政策的特定流中可用。

如需更正上面所示的示例政策,您可以将 <Copy> 元素中的来源属性更改为请求变量或请求流中存在的属于消息类型的任何其他自定义变量。

<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
   <DisplayName>googleBook</DisplayName>
   <Properties />
   <Copy source="request">
      <Headers>
         <Header name="user-agent" />
      </Headers>
   </Copy>
   <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
   <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
</AssignMessage>

VariableOfNonMsgType

错误代码

steps.assignmessage.VariableOfNonMsgType

错误响应正文

{
    "fault": {
        "faultstring": "AssignMessage[policy_name]: value of variable [variable] is not of type Message",
        "detail": {
            "errorcode": "steps.assignmessage.VariableOfNonMsgType"
        }
    }
}

原因

如果 <Copy> 元素中的 source 特性类型不是消息类型,则会出现此错误。

消息类型变量表示整个 HTTP 请求和响应。内置的 Edge 流变量 requestresponsemessage 的类型为消息。如需详细了解消息变量,请参阅变量参考

诊断

  1. 找出发生错误的分配消息政策,以及类型错误的变量名称。您可以在错误响应的 faultstring 元素中找到这两项。例如,在以下 faultstring 中,政策名称为 GenerateGeocodingRequest,变量为 PostalCode

    "faultstring": "AssignMessage[GenerateGeocodingRequest]: value of variable PostalCode is not of type Message"
    
  2. 在失败的分配消息政策 XML 中,验证 <Copy> 元素中设置的变量名称是否与故障字符串中标识的变量名称(上文第 1 步)相匹配。例如,以下政策将来源特性设置为名为 PostalCode 的变量,该变量与 faultstring 中的内容匹配:

    <AssignMessage name="GenerateGeocodingRequest">
       <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
       <AssignVariable>
          <Name>PostalCode</Name>
          <Ref>request.queryparam.postalcode</Ref>
       </AssignVariable>
       <AssignVariable>
          <Name>Country</Name>
          <Ref>request.queryparam.country</Ref>
       </AssignVariable>
       <Copy source="PostalCode">
          <QueryParams>
             <QueryParam name="q" />
          </QueryParams>
       </Copy>
    </AssignMessage>
    
  3. 确定此变量是否为消息类型:

    1. 在首次定义变量的 API 代理软件包中找到代码。
    2. 确定首次在其中定义并填充变量的政策后,您需要按以下方式确定该变量的类型:
      1. 检查 type 特性的值(如果存在)。
      2. 如果 type 特性不存在,则变量将被视为字符串。
    3. 如果变量的类型是非消息(例如字符串),则会导致错误。如需了解常见变量及其类型,请参阅变量参考文档

    例如,查看上述 XML 中的 PostalCode 变量。它被分配了 <AssignVariable> 元素中流变量 request.queryparam.postalcode 的值。该值为字符串,因为变量分配中不存在类型特性。

    如前文所述,分配消息政策的 <Copy> 元素中使用了 PostalCode 变量:

    <Copy source="PostalCode">
       <QueryParams>
          <QueryParam name="PostalCode" />
       </QueryParams>
    </Copy>
    

    由于 PostalCode 不是消息类型(在此示例中为字符串),因此您会收到错误代码:

    steps.assignmessage.VariableOfNonMsgType
    

解决方法

务必将失败的分配消息政策中 <Copy> 元素中的 source 属性设置为存在的消息类型流变量。

如需更正该政策,您可以修改 <Copy> 元素中的 source 特性来指定类型为消息的变量。例如,如果应在请求流中执行分配消息政策,则您可以使用消息类型变量 request 或消息类型的任何其他自定义变量。

<AssignMessage name="GenerateGeocodingRequest">
   <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
   <AssignVariable>
      <Name>PostalCode</Name>
      <Ref>request.queryparam.postalcode</Ref>
   </AssignVariable>
   <AssignVariable>
      <Name>Country</Name>
      <Ref>request.queryparam.country</Ref>
   </AssignVariable>
   <Copy source="request">
      <QueryParams>
         <QueryParam name="PostalCode" />
      </QueryParams>
   </Copy>
</AssignMessage>