Solución de problemas relacionados con el error de tiempo de ejecución de Message

Estás consultando la documentación de Apigee Edge.
Consulta la documentación de Apigee X.
Información

UnresolvedVariable

Código de error

steps.assignmessage.UnresolvedVariable

Cuerpo de la respuesta del error

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

Causa

Este error se produce si una variable especificada en la política AssignMessage es una de las siguientes:

  • fuera de alcance (no disponible en el flujo específico en el que se ejecuta la política)
  • no se puede resolver (no está definido)

Por ejemplo, este error ocurre si la política de asignación de mensajes se ejecuta en el flujo de solicitudes, pero el atributo source del elemento <Copy> se configura como la variable response o error, o cualquier otra variable personalizada que no existe en el flujo de solicitudes.

Diagnóstico

  1. Identifica la política de asignación de mensajes en la que se generó el error y el nombre de la variable que no está disponible. Puedes encontrar ambos elementos en el elemento faultstring de la respuesta de error.

    Por ejemplo, en el siguiente valor faultstring, el nombre de la política es googleBook y la variable es var:

    "faultstring": "AssignMessage[googleBook]: unable to resolve variable var"
    
  2. En el archivo XML de la política de asignación de mensajes, verifica que el nombre de la variable usada coincida con el nombre de variable identificado en la string con errores (paso 1 anterior). Por ejemplo, en la siguiente política, se establece el atributo de origen en el elemento <Copy> en una variable llamada var, que coincide con lo que hay en la 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. Determina si la variable está definida y disponible en el flujo en el que se ejecuta la política de protección contra el aumento de tráfico.

  4. Verifica si la variable tiene una de las siguientes características:

    1. fuera de alcance (no disponible en el flujo específico en el que se ejecuta la política) o
    2. no se puede resolver (no está definido)

    entonces esa es la causa del error.

    A modo de ejemplo, supongamos que la política de asignación de mensajes que se muestra arriba se ejecuta en el flujo de solicitudes. Verifica si la variable var se define en cualquiera de las políticas que se ejecutan antes de la política de asignación de mensajes en el flujo de solicitudes. Si no se definió la variable, recibirá el código de error:

    steps.assignmessage.UnresolvedVariable
    

Resolución

Asegúrate de que la variable a la que se hace referencia en la política exista y esté disponible en el flujo específico, en el que se ejecutará la política de asignación de mensajes.

Si quieres corregir la política de ejemplo que se muestra arriba, puedes modificar el atributo de origen en el elemento <Copy> para que sea la variable de solicitud o cualquier otra variable personalizada de tipo de mensaje que exista en el flujo de la solicitud.

<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

Código de error

steps.assignmessage.VariableOfNonMsgType

Cuerpo de la respuesta del error

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

Causa

Este error ocurre si el atributo source del elemento <Copy> se configuró como una variable que no es del tipo message.

Las variables del tipo de mensaje representan respuestas y solicitudes HTTP completas. Las variables de flujo de Edge integradas request, response y message son del tipo mensaje. Para obtener más información acerca de las variables de mensaje, consulta la Referencia de lasvariables.

Diagnóstico

  1. Identifica la política de asignación de mensajes en la que se generó el error y el nombre de la variable cuyo tipo es incorrecto. Puedes encontrar ambos elementos en el elemento faultstring de la respuesta de error. Por ejemplo, en el siguiente valor faultstring, el nombre de la política es GenerateGeocodingRequest y la variable es PostalCode:

    "faultstring": "AssignMessage[GenerateGeocodingRequest]: value of variable PostalCode is not of type Message"
    
  2. En el archivo XML de la política de asignación mensajes con errores, verifica que el nombre de la variable establecida en el elemento <Copy> coincida con el nombre de la variable identificado en la string con errores (paso 1 anterior). Por ejemplo, en la siguiente política, se establece un atributo de origen en una variable llamada PostalCode, que coincide con lo que hay en la 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. Determina si esta variable es de tipo de mensaje o no:

    1. Localiza el código dentro del paquete del proxy de API, en el que la variable se definió primero.
    2. Una vez que determinas la política en la que se define y propaga la variable primero, debes determinar el tipo de esa variable de la siguiente manera:
      1. Comprueba el valor del atributo del tipo (si está presente).
      2. Si el atributo de tipo no está presente, la variable se considera una string.
    3. Si el tipo de la variable no es de mensaje (como una string), esta es la causa del error. Puedes obtener información sobre las variables comunes y sus tipos en la referencia de variables.

    Por ejemplo, observa la variable PostalCode en la XML anterior. Se le asigna el valor de la variable de flujo request.queryparam.postalcode en el elemento <AssignVariable>. Este valor es una string, porque no hay un tipo de atributo presente en la asignación de la variable.

    Ahora, recuerda que la variable PostalCode se usa en el elemento <Copy> de la política de asignación de mensajes:

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

    Debido a que PostalCode no es de tipo de mensaje (en este ejemplo, es una string), recibes el código de error:

    steps.assignmessage.VariableOfNonMsgType
    

Resolución

Asegúrate de que el atributo source del elemento <Copy> de la política de asignación de mensajes con errores tenga una variable de flujo de tipo mensaje que existe.

Para corregir la política, puedes modificar el atributo source en el elemento <Copy> a fin de especificar una variable que sea de tipo de mensaje. Por ejemplo, si suponemos que la política de asignación de mensajes se ejecutará en el flujo de solicitudes, puedes usar la variable de tipo de mensaje request o cualquier otra variable personalizada de tipo de mensaje.

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