排解 Message 政策部署錯誤

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

InvalidIndex

錯誤訊息

透過 Edge UI 或 Edge Management API 部署 API Proxy 會失敗,並顯示以下錯誤訊息:

Error in deployment for environment [environment]
The revision is deployed, but traffic cannot flow.
AssignMessage[policy_name]: index must be greater than zero in [attribute].[index]

錯誤訊息示例

Error in deployment for environment test.
The revision is deployed, but traffic cannot flow.
AssignMessage[GenerateStudentsRequest]: index must be greater than zero in id.0

螢幕截圖範例

原因

如果「指派訊息」政策的 <Copy> 和/或 <Remove> 元素中指定的索引為 0 或負數,則 API Proxy 部署作業就會失敗。

舉例來說,如果您傳遞多個名稱相同的查詢參數,就能在 Edge 中以索引流程變數的形式存取這些參數。假設您想要傳送 3 位學生的 ID 做為查詢參數,請按照下列步驟操作:

https://myorg-test.apigee.net/v1/basepath?school_name=NPS&id=1&id=2&id=3

然後,假設您嘗試在「指派訊息」政策中,使用索引號碼 0、1 和 2 存取這些查詢參數,如下所示:

id.0
id.1 and
id.2

在這種情況下,Proxy 部署作業會失敗,因為索引的開頭須為 1。也就是說,您可以存取第一個查詢參數「id=1」例如「id.1」。如要存取第二個查詢參數「id=2」,請使用索引 2,也就是「id.2」。同樣地,如要存取第三個查詢參數「id=3」,您可以使用「id.3」。

詳情請參閱這篇說明文章

診斷

  1. 找出發生錯誤的「指派訊息」政策、屬性名稱和無效的索引。您可以在錯誤訊息中找到以上所有項目。例如,在下列錯誤中,政策名稱為 GeneratingGeocodingRequest,屬性名稱為 id,索引為 0

    AssignMessage[GenerateStudentsRequest]: index must be greater than zero in id.0
    
  2. 確認失敗的「指派訊息」政策 XML 中使用的屬性名稱和索引與錯誤訊息中指出的索引相符 (上述步驟 1)。舉例來說,下列政策指定 id 屬性和索引為 0,與錯誤訊息的內容相符:

    <AssignMessage name="GenerateStudentsRequest">
      <AssignTo createNew="true" type="request">StudentsInfoRequest</AssignTo>
      <Copy source="request">
          <QueryParams>
              <QueryParam name="school_name"/>
              <QueryParam name="id.0"/>
              <QueryParam name="id.1"/>
              <QueryParam name="id.2"/>
          </QueryParams>
      </Copy>
    </AssignMessage>
    
  3. 如果指定的索引是 0 或負數,就會產生錯誤。

    在上述的「指派訊息」政策範例中,您正在嘗試存取查詢參數「id」的第一個值索引 0因此,API Proxy 部署作業失敗並收到以下錯誤:

    AssignMessage[GenerateStudentsRequest]: index must be greater than zero in id.0
    

解析度

在「指派郵件」中,當您存取多個名稱相同的標頭、查詢參數或其他參數時,請確認索引一律大於 0。例如:

<AssignMessage name="GenerateStudentsRequest">
    <AssignTo createNew="true" type="request">StudentsInfoRequest</AssignTo>
    <Copy source="request">
        <QueryParams>
            <QueryParam name="school_name"/>
            <QueryParam name="id.1"/>
            <QueryParam name="id.2"/>
            <QueryParam name="id.3"/>
        </QueryParams>
    </Copy>
</AssignMessage>

InvalidVariableName

錯誤訊息

透過 Edge UI 或 Edge Management API 部署 API Proxy 會失敗,並顯示以下錯誤訊息:

Error Saving Revision [revision_number]
The revision is deployed, but traffic cannot flow. AssignMessage schema validation failed: invalid variable name - null - in assign variable.

錯誤訊息示例

Error Saving Revision 3
AssignMessage schema validation failed: invalid variable name - null - in assign variable.

螢幕截圖範例

原因

如果 <AssignVariable> 元素中缺少可指派值的有效變數名稱,如果子元素 <Name> 為空白或未指定,API Proxy 部署作業就會失敗。必須提供有效的變數名稱。

診斷

在失敗的特定 API Proxy 中檢查所有「指派訊息」政策。如有任何「指派訊息」政策的子元素 <Name> 為空白,或是未在 <AssignVariable> 元素中指定,就是導致錯誤的原因。

範例 1:下列「指派訊息」政策未定義任何 <Name> 元素。

<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
    <DisplayName>Assign Message-1</DisplayName>
    <Properties/>
    <AssignVariable>
        <Value>abcd1234</Value>
    </AssignVariable>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
</AssignMessage>

示例 2:下列「指派訊息」政策包含空白的 <Name> 元素。

<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
    <DisplayName>Assign Message-1</DisplayName>
    <Properties/>
    <AssignVariable>
        <Name></Name>
        <Value>abcd1234</Value>
    </AssignVariable>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
</AssignMessage>

解析度

確認「指派訊息」政策的 <AssignVariable> 元素一律指定 <Name> 子元素,且該元素不可為空白。例如:

<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
    <DisplayName>Assign Message-1</DisplayName>
    <Properties/>
        <AssignVariable>
        <Name>appSecret</Name>
        <Value>abcd1234</Value>
    </AssignVariable>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
</AssignMessage>