Khắc phục sự cố khi chỉ định thời gian chạy của Thông báo

Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến Tài liệu về Apigee X.
thông tin

UnresolvedVariable

Mã lỗi

steps.assignmessage.UnresolvedVariable

Nội dung phản hồi về lỗi

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

Nguyên nhân

Lỗi này xảy ra nếu một biến được chỉ định trong Chính sách gán thông báo là:

  • ngoài phạm vi (không áp dụng trong quy trình cụ thể nơi chính sách đang được thực thi) hoặc
  • không thể giải quyết (không xác định)

Ví dụ: lỗi này xảy ra nếu chính sách Chỉ định thông báo thực thi trong quy trình yêu cầu, nhưng thuộc tính source trong phần tử <Copy> lại được đặt thành biến response hoặc error hoặc bất kỳ biến tuỳ chỉnh nào khác không tồn tại trong quy trình yêu cầu.

Chẩn đoán

  1. Xác định Chính sách gán thông báo nơi xảy ra lỗi và tên của biến không khả dụng. Bạn có thể tìm thấy cả hai mục này trong phần tử faultstring của phản hồi lỗi.

    Ví dụ: trong faultstring sau, tên chính sách là googleBook và biến là var:

    "faultstring": "AssignMessage[googleBook]: unable to resolve variable var"
    
  2. Trong XML gán chính sách thông báo không thành công, hãy xác minh rằng tên của biến được sử dụng khớp với tên biến được xác định trong chuỗi lỗi (bước #1 ở trên). Ví dụ: chính sách sau đây đặt thuộc tính nguồn trong phần tử <Copy> thành một biến có tên var, khớp với nội dung trong 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. Xác định xem biến đó đã được định nghĩa và có sẵn trong quy trình thực thi chính sách Chỉ định thông báo hay chưa.

  4. Nếu biến là:

    1. ngoài phạm vi (không áp dụng trong quy trình cụ thể nơi chính sách đang được thực thi) hoặc
    2. không thể giải quyết (không xác định)

    thì đó là nguyên nhân gây ra lỗi.

    Ví dụ: giả sử chính sách Chỉ định tin nhắn trình bày ở trên sẽ thực thi trong quy trình yêu cầu. Kiểm tra xem biến var có được xác định trong bất kỳ chính sách nào được thực thi trước chính sách Chỉ định thông báo trong quy trình yêu cầu hay không. Nếu biến đó chưa được xác định, bạn sẽ nhận được mã lỗi:

    steps.assignmessage.UnresolvedVariable
    

Độ phân giải

Đảm bảo rằng biến được tham chiếu trong chính sách tồn tại và hoạt động trong quy trình cụ thể, nơi chính sách Chỉ định thông báo đang được thực thi.

Để sửa chính sách mẫu nêu trên, bạn có thể sửa đổi thuộc tính nguồn trong phần tử <Copy> thành biến yêu cầu hoặc bất kỳ biến tuỳ chỉnh nào khác thuộc loại thông báo tồn tại trong luồng yêu cầu.

<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

Mã lỗi

steps.assignmessage.VariableOfNonMsgType

Nội dung phản hồi về lỗi

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

Nguyên nhân

Lỗi này xảy ra nếu thuộc tính source trong phần tử <Copy> được đặt thành một biến không thuộc loại message.

Biến kiểu thông báo đại diện cho toàn bộ các yêu cầu và phản hồi HTTP. Các biến luồng Edge tích hợp sẵn request, responsemessage đều thuộc loại thông báo. Để tìm hiểu thêm về các biến thông báo, hãy xem bài viết Tài liệu tham khảo về biến.

Chẩn đoán

  1. Xác định Chính sách gán thông báo nơi lỗi xảy ra và tên của biến có loại không chính xác. Bạn có thể tìm thấy cả hai mục này trong phần tử faultstring của phản hồi lỗi. Ví dụ: trong faultstring sau, tên chính sách là GenerateGeocodingRequest và biến là PostalCode:

    "faultstring": "AssignMessage[GenerateGeocodingRequest]: value of variable PostalCode is not of type Message"
    
  2. Trong tệp XML gán chính sách thông báo bị lỗi, hãy xác minh rằng tên của biến được đặt trong phần tử <Copy> khớp với tên biến được xác định trong chuỗi lỗi (bước #1 ở trên). Ví dụ: chính sách sau đây đặt thuộc tính nguồn thành một biến có tên PostalCode, khớp với nội dung trong 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. Xác định xem biến này có thuộc loại thông báo hay không:

    1. Tìm mã trong gói API Proxy, nơi biến được xác định đầu tiên.
    2. Sau khi tìm ra chính sách mà trong đó biến được xác định và điền trước tiên, bạn cần xác định loại biến như sau:
      1. Kiểm tra giá trị của thuộc tính loại (nếu có).
      2. Nếu không có thuộc tính loại thì biến được coi là một chuỗi.
    3. Nếu loại biến không phải là thông báo (chẳng hạn như một chuỗi), thì đó là nguyên nhân gây ra lỗi. Bạn có thể tìm hiểu về các biến phổ biến và loại biến trong Tài liệu tham khảo về biến.

    Ví dụ: hãy xem biến PostalCode trong XML ở trên. Giá trị này được gán giá trị của biến luồng request.queryparam.postalcode trong phần tử <AssignVariable>. Giá trị này là một chuỗi vì không có thuộc tính loại nào trong lệnh gán biến.

    Bây giờ, hãy nhớ rằng biến PostalCode được dùng trong phần tử <Copy> của chính sách Gán thông báo:

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

    Vì PostalCode không thuộc loại thông báo (đây là một chuỗi trong ví dụ này) nên bạn sẽ nhận được mã lỗi sau:

    steps.assignmessage.VariableOfNonMsgType
    

Độ phân giải

Đảm bảo rằng thuộc tính source trong phần tử <Copy> của chính sách Gán thông báo không thành công đã được đặt thành biến luồng thông báo đã tồn tại.

Để sửa chính sách này, bạn có thể sửa đổi thuộc tính source trong phần tử <Copy> để chỉ định một biến thuộc loại thông báo. Ví dụ: nếu chính sách Chỉ định thông báo cần thực thi trong luồng yêu cầu, thì bạn có thể sử dụng biến loại thông báo request hoặc bất kỳ biến tuỳ chỉnh nào khác thuộc loại thông báo.

<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>