Назначьте устранение ошибок во время выполнения сообщения

Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee
X.info

Неразрешенная переменная

Код ошибки

steps.assignmessage.UnresolvedVariable

Тело ответа об ошибке

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

Причина

Эта ошибка возникает, если переменная, указанная в политике «Присвоить сообщение», имеет одно из следующих значений:

  • выходит за рамки действия (недоступно в конкретном процессе, в котором выполняется политика) или
  • Не может быть решено (не определено)

Например, эта ошибка возникает, если политика «Назначить сообщение» выполняется в потоке запроса, но атрибут source в элементе <Copy> установлен на переменную response или error , или любую другую пользовательскую переменную, которая не существует в потоке запроса.

Диагноз

  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
    

Разрешение

Убедитесь, что переменная, на которую ссылается политика, существует и доступна в конкретном потоке, где выполняется политика назначения сообщений.

Чтобы исправить приведенный выше пример политики, вы можете изменить атрибут source в элементе <Copy> на переменную запроса или любую другую пользовательскую переменную типа message, существующую в потоке запроса.

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

Причина

Эта ошибка возникает, если атрибуту source в элементе <Copy> присвоено значение переменной, не являющейся типом message .

Переменные типа Message представляют собой полные HTTP-запросы и ответы. Встроенные переменные потока Edge — request , response и message имеют тип message. Для получения дополнительной информации о переменных типа Message см. справочник по переменным .

Диагноз

  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. Если атрибут типа отсутствует, то переменная считается строкой.
    3. Если тип переменной не является сообщением (например, строкой), то это и является причиной ошибки. Подробнее о распространенных переменных и их типах можно узнать в справочнике по переменным .

    Например, взгляните на переменную PostalCode в приведенном выше XML-коде. Ей присваивается значение переменной потока request.queryparam.postalcode в элементе <AssignVariable> . Это значение является строкой, поскольку в присваивании переменной отсутствует атрибут type.

    Напомним, что переменная PostalCode используется в элементе <Copy> политики Assign Message:

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

    Поскольку PostalCode не имеет типа сообщения (в этом примере это строка), вы получаете код ошибки:

    steps.assignmessage.VariableOfNonMsgType
    

Разрешение

Убедитесь, что атрибут source в элементе <Copy> в неудачно выполненной политике Assign Message установлен на существующую переменную потока типа сообщения .

Для корректировки политики можно изменить атрибут source в элементе <Copy> , указав переменную типа message. Например, если политика Assign Message должна выполняться в потоке запроса, можно использовать переменную типа message типа request или любую другую пользовательскую переменную типа message.

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