指派「訊息執行階段錯誤疑難排解」

您目前查看的是 ApigeeApigee Hybrid 說明文件。
查看 Apigee Edge 說明文件。

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 屬性設為非 message 類型的變數,就會發生這項錯誤。

訊息型別變數代表整個 HTTP 要求和回應。內建流程變數 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 Proxy 套件中找出程式碼,其中變數是先定義的。
    2. 找出變數定義和填入的政策後,請按照下列步驟判斷變數類型:
      1. 檢查類型屬性的值 (如有)。
      2. 如果沒有 type 屬性,變數會視為字串。
    3. 如果變數的類型不是訊息 (例如字串),這就是造成錯誤的原因。如要瞭解常見變數及其類型,請參閱「變數參考資料」。

    舉例來說,請查看上述 XML 中的 PostalCode 變數。系統會將 <AssignVariable> 元素中的流程變數 request.queryparam.postalcode 值指派給這個變數。由於變數指派中沒有類型屬性,因此這個值是字串。

    現在,請回想一下,PostalCode 變數是用於指派訊息政策的 <Copy> 元素:

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

    由於 PostalCode 不是訊息類型 (在本例中為字串),您會收到錯誤碼:

    steps.assignmessage.VariableOfNonMsgType
    

解析度

請確認失敗的「指派訊息」政策中,<Copy> 元素內的 source 屬性是否設為現有的 message 類型流程變數。

如要修正政策,可以修改 <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>