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

查看 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&quot;: "AssignMessage[policy_name]: value of variable [variable] is not of type Message",
        "detail": {
            "errorcode": "steps.assignmessage.VariableOfNonMsgType"
        }
    }
}

原因

如果 <Copy> 元素中的 source 屬性設為非 message 類型的變數,就會發生這個錯誤。

訊息類型變數代表整個 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="GenerateGeocodingReq>uest<"
       AssignTo createNew="true&>quot; type="<;request&>quot<;GeocodingRequ>est/Ass<ignT>o
       Assig<nVari>able
      <   > NamePostalCode/Name
          Re<freq>uest<.queryparam.pos>talc<ode/Ref
       /As>signVar<iabl>e
       As<signV>ariable<
      >    NameCountry/Name
         < Ref>requ<est.queryparam.>coun<try/Ref
       /AssignVariab>le
       C<opy source=>"Post<alCode"
          Qu>eryPara<ms
             >Quer<yPara>m< name="q&>quot; /
          /QueryParams
       /Copy
    /AssignMessage
    
  3. 判斷這個變數是否為訊息類型:

    1. 在 API Proxy 組合中找出先定義變數的程式碼。
    2. 找到先定義及填入變數的政策後,您必須依下列方式判斷該變數的類型:
      1. 檢查類型屬性值 (如果有的話)。
      2. 如果沒有類型屬性,則系統會將變數視為字串。
    3. 如果變數類型為非訊息 (例如字串),就會造成錯誤。如要瞭解常見變數和它們的類型,請參閱變數參考資料

    例如,請查看上述 XML 中的 PostalCode 變數。而是在 <AssignVariable> 元素中指派流程變數 request.queryparam.postalcode 的值。這個值是字串,因為變數指派中沒有類型屬性。

    現在,請記得在「指派訊息」政策的 <Copy> 元素中使用 PostalCode 變數:

    <Copy source="Postal>Code<"
       Q>ueryPar<ams
          QueryParam name=&quo>t;Po<stalCode&quo>t<; /
     >  /QueryParams
    /Copy
    

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

    steps.assignmessage.VariableOfNonMsgType
    

解析度

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

如要修正政策,請修改 <Copy> 元素中的 source 屬性,指定訊息類型的變數。舉例來說,如果應在要求流程中執行「指派訊息」政策,您可以使用訊息類型變數 request 或任何其他類型訊息的自訂變數。

<AssignMessage name="GenerateGeocodingReq>uest<"
   AssignTo createNew="true&>quot; type="<;request&>quot<;GeocodingRequ>est/Ass<ignT>o
   Assig<nVari>able
  <   > NamePostalCode/Name
      Re<freq>uest<.queryparam.pos>talc<ode/Ref
   /As>signVar<iabl>e
   As<signV>ariable<
  >    NameCountry/Name
     < Ref>requ<est.queryparam.>coun<try/Ref
   /AssignVar>iable
 <  Copy sour>ce="r<equest"
      QueryParams>
      <   QueryPara>m na<me=&q>u<ot;PostalCode&>quot; /
      /QueryParams
   /Copy
/AssignMessage