عیب یابی خطای زمان اجرا پیام را تعیین کنید

شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید .
اطلاعات

حل نشدهمتغیر

کد خطا

steps.assignmessage.UnresolvedVariable

متن پاسخ خطا

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

علت

این خطا زمانی رخ می‌دهد که متغیری که در سیاست Assign Message مشخص شده است، یکی از موارد زیر باشد:

  • خارج از محدوده (در جریان خاصی که سیاست در آن اجرا می‌شود، در دسترس نیست) یا
  • قابل حل نیست (تعریف نشده است)

برای مثال، این خطا در صورتی رخ می‌دهد که سیاست Assign Message در جریان درخواست اجرا شود، اما ویژگی source در عنصر <Copy> روی متغیر response یا error یا هر متغیر سفارشی دیگری که در جریان درخواست وجود ندارد، تنظیم شده باشد.

تشخیص

  1. خط‌مشی اختصاص پیام که خطا در آن رخ داده و نام متغیری که در دسترس نیست را شناسایی کنید. می‌توانید هر دوی این موارد را در عنصر faultstring پاسخ خطا پیدا کنید.

    برای مثال، در faultstring زیر، نام سیاست googleBook و متغیر var است:

    "faultstring": "AssignMessage[googleBook]: unable to resolve variable var"
    
  2. در XML مربوط به Assign Message Policy ناموفق، بررسی کنید که نام متغیر استفاده شده با نام متغیر شناسایی شده در fault string (مرحله ۱ در بالا) مطابقت داشته باشد. برای مثال، policy زیر ویژگی 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. تعیین کنید که آیا متغیر در جریانی که سیاست Assign Message در آن اجرا می‌شود، تعریف شده و در دسترس است یا خیر.

  4. اگر متغیر یکی از موارد زیر باشد:

    1. خارج از محدوده (در جریان خاصی که سیاست در آن اجرا می‌شود، در دسترس نیست) یا
    2. قابل حل نیست (تعریف نشده است)

    پس علت خطا همین است.

    به عنوان مثال، فرض کنید سیاست Assign Message که در بالا نشان داده شده است در جریان درخواست اجرا می‌شود. بررسی کنید که آیا متغیر var در هر یک از سیاست‌هایی که قبل از سیاست Assign Message در جریان درخواست اجرا می‌شوند، تعریف شده است یا خیر. اگر متغیر تعریف نشده باشد، کد خطا را دریافت خواهید کرد:

    steps.assignmessage.UnresolvedVariable
    

وضوح تصویر

اطمینان حاصل کنید که متغیر ارجاع شده در سیاست، در جریان خاص، جایی که سیاست «اختصاص پیام» در حال اجرا است، وجود دارد و در دسترس است.

برای اصلاح سیاست مثال نشان داده شده در بالا، می‌توانید ویژگی منبع را در عنصر <Copy> تغییر دهید تا متغیر درخواست یا هر متغیر سفارشی دیگری از نوع پیام که در جریان درخواست وجود دارد، باشد.

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

متغیرنوع غیر MSG

کد خطا

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 از نوع پیام هستند. برای کسب اطلاعات بیشتر در مورد متغیرهای پیام، به مرجع متغیرها مراجعه کنید.

تشخیص

  1. خط‌مشی پیام تخصیص (Assign Message Policy) که خطا در آن رخ داده و نام متغیری که نوع آن نادرست است را شناسایی کنید. می‌توانید هر دوی این موارد را در عنصر faultstring پاسخ خطا پیدا کنید. برای مثال، در faultstring زیر، نام خط‌مشی GenerateGeocodingRequest و متغیر PostalCode است:

    "faultstring": "AssignMessage[GenerateGeocodingRequest]: value of variable PostalCode is not of type Message"
    
  2. در XML مربوط به Assign Message Policy ناموفق، بررسی کنید که نام متغیر تنظیم شده در عنصر <Copy> با نام متغیر شناسایی شده در fault string (مرحله ۱ در بالا) مطابقت داشته باشد. برای مثال، policy زیر یک ویژگی source را به متغیری به نام 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. مقدار ویژگی نوع (type) را (در صورت وجود) بررسی کنید.
      2. اگر ویژگی نوع وجود نداشته باشد، متغیر به عنوان یک رشته در نظر گرفته می‌شود.
    3. اگر نوع متغیر غیر از نوع پیام (مانند رشته) باشد، علت خطا همین است. می‌توانید در مرجع متغیرها (Variables ) در مورد متغیرهای رایج و انواع آنها اطلاعات کسب کنید.

    برای مثال، به متغیر 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> تغییر دهید تا متغیری از نوع پیام را مشخص کنید. برای مثال، اگر قرار است سیاست اختصاص پیام در جریان درخواست اجرا شود، می‌توانید از متغیر نوع پیام 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>