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

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

UnresolvedVariable

Код ошибки

steps.assignmessage.UnresolvedVariable

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

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

Причина

Эта ошибка возникает, если переменная, указанная в правиле назначения сообщения:

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

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

диагностика;

  1. Определите правило Assign Message Policy, в котором произошла ошибка, и название недоступной переменной. Оба этих элемента можно найти в элементе faultstring ответа об ошибке.

    Например, в следующем теге faultstring название правила – googleBook, а переменная – var:

    "faultstring": "AssignMessage[googleBook]: unable to resolve variable var"
    
  2. В XML-файле политики сообщений, который не удалось назначить, убедитесь, что название используемой переменной совпадает с названием переменной, указанным в строке ошибки (шаг 1 выше). Например, следующая политика задает для атрибута source в элементе <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. не может быть разрешен (не определен);

    то это и есть причина ошибки.

    Предположим, что в потоке запроса выполняется правило Assign Message, показанное выше. Проверьте, определена ли переменная var в каких-либо правилах, которые выполняются до правила Assign Message в потоке запроса. Если переменная не определена, вы получите код ошибки:

    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.

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

диагностика;

  1. Определите правило Assign Message Policy, в котором произошла ошибка, и название переменной с неправильным типом. Оба этих элемента можно найти в элементе 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 код, в котором впервые была определена переменная.
    2. Определив, в каких правилах переменная задается и заполняется первой, определите ее тип, выполнив следующие действия:
      1. Проверьте значение атрибута type (если он есть).
      2. Если атрибут type отсутствует, переменная считается строкой.
    3. Если тип переменной не является сообщением (например, это строка), то это и есть причина ошибки. Информацию о распространенных переменных и их типах можно найти в справочнике по переменным.

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

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

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

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

    steps.assignmessage.VariableOfNonMsgType
    

Разрешение

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

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