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

شما در حال مشاهده اسناد 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 یکی از این موارد باشد:

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

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

تشخیص

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

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

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

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

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

    پس این دلیل خطا است.

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

    steps.assignmessage.UnresolvedVariable
    

قطعنامه

اطمینان حاصل کنید که متغیر اشاره شده در خط مشی وجود دارد و در جریان خاص، جایی که خط مشی Assign Message در حال اجرا است، موجود است.

برای تصحیح سیاست مثال نشان داده شده در بالا، می توانید ویژگی منبع را در عنصر <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>

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

متغیرهای نوع پیام، کل درخواست‌ها و پاسخ‌های HTTP را نشان می‌دهند. متغیرهای جریان لبه داخلی request ، response و message از نوع پیام هستند. برای کسب اطلاعات بیشتر در مورد متغیرهای پیام، به مرجع متغیرها مراجعه کنید.

تشخیص

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

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

    برای مثال، به متغیر PostalCode در XML بالا نگاه کنید. مقدار متغیر جریان request.queryparam.postalcode در عنصر <AssignVariable> به آن اختصاص داده می شود. این مقدار یک رشته است، زیرا هیچ ویژگی نوع در انتساب متغیر وجود ندارد.

    اکنون، به یاد بیاورید که متغیر PostalCode در عنصر <Copy> خط مشی Assign Message استفاده می شود:

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

    از آنجایی که PostalCode از نوع پیام نیست (در این مثال یک رشته است)، کد خطا را دریافت می کنید:

    steps.assignmessage.VariableOfNonMsgType
    

قطعنامه

اطمینان حاصل کنید که ویژگی source در عنصر <Copy> در خط مشی ناموفق Assign Message روی متغیر جریان نوع پیام موجود تنظیم شده است.

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