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

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

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

Код ошибки

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
    

Разрешение

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

Чтобы исправить пример политики, показанный выше, вы можете изменить атрибут источника в элементе <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>

ПеременнаяОфНонмсгтипе

Код ошибки

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 .

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

Диагностика

  1. Определите политику назначения сообщений, в которой произошла ошибка, и имя переменной, тип которой неверен. Оба этих элемента можно найти в элементе faultstring ответа об ошибке. Например, в следующей faultstring имя политики — GenerateGeocodingRequest , а переменная — PostalCode :

    "faultstring": "AssignMessage[GenerateGeocodingRequest]: value of variable PostalCode is not of type Message"
    
  2. В XML-коде Assign Message Policy 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, где переменная была определена первой.
    2. После того, как вы определите политику, в которой переменная определяется и заполняется в первую очередь, вам необходимо определить тип этой переменной следующим образом:
      1. Проверьте значение атрибута type (если он присутствует).
      2. Если атрибут type отсутствует, переменная считается строкой.
    3. Если тип переменной не является сообщением (например, строка), то это и есть причина ошибки. Вы можете узнать об распространенных переменных и их типах в справочнике по переменным .

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

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

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

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

    steps.assignmessage.VariableOfNonMsgType
    

Разрешение

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

Чтобы исправить политику, вы можете изменить атрибут source в элементе <Copy> , указав переменную типа message. Например, если политика назначения сообщения должна выполняться в потоке запросов, вы можете использовать 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>