Apollo-link-rest: "TypeError: إعادة التوجيه ليست دالة"

تم إنشاؤها على ١٤ نوفمبر ٢٠١٨  ·  19تعليقات  ·  مصدر: apollographql/apollo-link-rest

هيا ،

لقد واجهت نفس الخطأ في كل مرة استخدمت فيها apollo-link-rest: فتح GraphiQL في أدوات تطوير Apollo يظهر دائمًا خطأ "TypeError: forward not a function". النص الكامل للخطأ:

{ "errors": [ { "message": "forward is not a function", "locations": [ "TypeError: forward is not a function\n at RestLink../node_modules/apollo-link-rest/bundle.umd.js.RestLink.request (http://localhost:3000/static/js/bundle.js:5566:24)\n at http://localhost:3000/static/js/bundle.js:5746:33\n at ApolloLink.request (http://localhost:3000/static/js/bundle.js:2602:20)\n at ApolloLink.request (http://localhost:3000/static/js/bundle.js:5745:31)\n at chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:3681\n at e.request (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:38654)\n at chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:3681\n at e.request (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:38421)\n at chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:3681\n at chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:38085\n at new s (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:4855)\n at l.subscribe (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:6185)\n at n.<anonymous> (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:38914)\n at n.t.emit (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:52786)\n at chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:19519\n at n (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/backend.js:1:36148)" ] } ] }

يبدو أن الاستعلامات والطفرات مع التوجيه rest تعمل بشكل جيد ولا client لا يعمل ويطرح نفس الخطأ (مثل حمولة الخطأ في ملفمكون من رد فعل أبولو).

لقد قمت باستنساخ الأمثلة الثلاثة لمشاريع رد فعل أبولو (بسيطة ، متقدمة ، مطبوعة على الكتابة) ويظهر نفس الخطأ في الثلاثة. # 121 يشير إلى هذه المشكلة ولكن لا يبدو أن هناك حلًا ؛ الإصلاح المضمن هو خطأ منفصل "فشل في الجلب". هناك أيضًا إشارة إلى rest أو توجيه كسبب محتمل ، ولكن كما ذكرنا ، يحدث هذا مع نماذج المشاريع بالإضافة إلى مشاريعي الخاصة ، لذلك لا أعتقد أن التوجيه المفقود هو الجاني.

لإعادة الإنتاج ، ما عليك سوى استنساخ أمثلة المشاريع ، وتثبيت وبدء وفتح أدوات Apollo dev في Chrome (الإصدار الحالي الذي أواجه هذا الخطأ فيه هو 70.0.3538.77).

شكرًا لإلقاء نظرة على هذا ، أحب العبوة ووجدها مفيدة بشكل لا يصدق!

bug 🐛 enhancement💡 has-reproduction help wanted 🛠 question❔

التعليق الأكثر فائدة

أهلا! لقد تمكنت من النظر قليلاً في سبب هذه المشكلة.
يبدو أنه تم استدعاء هذه العملية بواسطة apollo-client-devtools.

عندما يصل إلى هنا ، يكون forward غير محدد.

لست متأكدًا تمامًا من كيفية عمل كل هذا وإلا سأقوم بعمل علاقات عامة لإصلاح المشكلة. عندما قمت بتغيير الشيك !isRestQuery إلى !isRestQuery && forward تمكنت من إسكات الخطأ أعلاه. ومع ذلك ، حصلت على خطأ جديد:

Error: Type Query must define one or more fields.
    at t.assertValidSchema (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:258433)
    at O (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:272246)
    at k (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:271277)
    at t.execute (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:270565)
    at t.v (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:806774)
    at t.n.emit (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:394893)
    at chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:517657

في ما يلي مثال على التطبيق الذي استخدمته لرؤية / تصحيح هذه المشكلة: https://github.com/Hilaryous/simple-react-app/tree/apollo-link-rest-example.

شكرا لك على كل عملك في هذه المكتبة. إذا كان بإمكاني المساعدة بأي طريقة ، فسأكون سعيدًا للقيام بذلك.

ال 19 كومينتر

لا أعتقد أن GraphIQL تدعم apollo-link-state / apollo-link-rest - لا أعتقد أنها تدعم الروابط بشكل عام. هل لديك أمثلة على هذا العمل؟

بالتأكيد ، يبدو أن GraphiQL في أدوات تطوير Apollo تعمل. باستخدام JSONPlaceholder api ، تم تعيين RestLink uri على https://jsonplaceholder.typicode.com - إليك ما أحصل عليه في البداية قبل تشغيل أي استعلامات:

apollo-devtools-initial

بعد تشغيل الاستعلام للحصول على جميع المستخدمين:

apollo-devtools-users

أو مع مثال المشروع "البسيط":

apollo-devtools-simple

هناك شيء آخر لاحظته وهو أن خيار "القراءة من ذاكرة التخزين المؤقت" لا يعمل مع الإدخالات الجديدة التي تم إنشاؤها باستخدام واجهة برمجة تطبيقات JSONPlaceholder ؛ تقوم طفرة POST بكتابة إدخال جديد إلى ذاكرة التخزين المؤقت بشكل صحيح ، ولكن طلب بحث لاحق يحاول الاستعلام عن بُعد حتى مع تحديد "قراءة من ذاكرة التخزين المؤقت". نظرًا لأن الإدخال الجديد لم يتم إنشاؤه فعليًا ، فإن هذا إرجاع فارغ من نقطة النهاية البعيدة كما هو متوقع ، ولكن تم إنشاؤه في ذاكرة التخزين المؤقت ، لذلك يجب أن تعيده "القراءة من ذاكرة التخزين المؤقت"؟ ربما يكون هذا محايدًا بالنسبة لـ apollo-link-rest ، وخارج نطاق هذه المشكلة ، لكنه لا يزال مثيرًا للاهتمام.

تظهر لي نفس الخطأ في GraphiQL ، forward is not a function . يبدو أن كل شيء بجانب cache يعمل بالرغم من ذلك.

أي تحديثات على هؤلاء الرجال ، لقد واجهت نفس المشكلة :(

cstoddart لوحة ذاكرة التخزين المؤقت فارغة ، أليس كذلك؟

هل يعرف أي شخص كيفية عرض ذاكرة التخزين المؤقت بدون أدوات التطوير؟

أنا أعاني من نفس الشيء. cgatian نعم ، لوحة ذاكرة التخزين المؤقت الخاصة بي فارغة.

من الصعب تبني سلسلة أدوات أبولو عندما تحدث هذه الانكسارات لفترة طويلة. هل ما زالت عملية أبولو-لينك-ريست قيد العمل بنشاط؟

heymanhn - نعم يتم تطوير ApolloLinkRest بنشاط. لكن هذا مفتوح المصدر. يسعدني مساعدتك في الحصول على اختبار العلاقات العامة وتسليمه ، لكن ليس لدي خبرة مع ApolloDevTools.

نحتاج إلى شخص يفعل ذلك ، أو يرغب في الغوص في قاعدة بياناته لمعرفة ما هو ضروري ليكون متوافقًا معه. أتحداك أن تعرف ما هو مفقود وأود أن أدعم مساهماتك!

أريد أن أكون واضحًا ، فأنا لا أعرف أن Apollo-link-rest عملت على الإطلاق مع ApolloDevTools ، لذلك أقول إن هذا أقل كسرًا ، وأكثر من ميزة مرغوبة مفقودة .

بالإضافة إلى ذلك ، أنا شخصياً أستخدم apollo-link-rest مع React-Native ، ومنذ عام مضى ، لم يكن ApolloDevTools متوافقًا مع React-Native.

لقد أعلنوا منذ ذلك الحين أنهم أصلحوا ذلك ، لكنني لم أتمكن من تنشيط ApolloDevTools لمشروع رد الفعل الأصلي لفريقي ، لذلك لا أعرف ما هو الخطأ هناك.

أهلا! لقد تمكنت من النظر قليلاً في سبب هذه المشكلة.
يبدو أنه تم استدعاء هذه العملية بواسطة apollo-client-devtools.

عندما يصل إلى هنا ، يكون forward غير محدد.

لست متأكدًا تمامًا من كيفية عمل كل هذا وإلا سأقوم بعمل علاقات عامة لإصلاح المشكلة. عندما قمت بتغيير الشيك !isRestQuery إلى !isRestQuery && forward تمكنت من إسكات الخطأ أعلاه. ومع ذلك ، حصلت على خطأ جديد:

Error: Type Query must define one or more fields.
    at t.assertValidSchema (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:258433)
    at O (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:272246)
    at k (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:271277)
    at t.execute (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:270565)
    at t.v (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:806774)
    at t.n.emit (chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:394893)
    at chrome-extension://jdkknkkbebbapilgoeccciglkfbmbnfm/dist/devtools.js:1:517657

في ما يلي مثال على التطبيق الذي استخدمته لرؤية / تصحيح هذه المشكلة: https://github.com/Hilaryous/simple-react-app/tree/apollo-link-rest-example.

شكرا لك على كل عملك في هذه المكتبة. إذا كان بإمكاني المساعدة بأي طريقة ، فسأكون سعيدًا للقيام بذلك.

لقد واجهت هذا مؤخرًا وقمت بتضييق الخطأ في حالتي إلى IntrospectionQuery ، والذي أعتقد أن Graphiql / devtools تستعلم عن خادم Graphql للمخطط؟ المشكلة هي أنني أستخدم فقط apollo-client و apollo-link-rest ، لذلك لا يوجد خادم أو مخطط ، باستثناء مخطط ذاكرة التخزين المؤقت (إذا كان هناك واحد). في المقابل ، فإن أدوات apollo devtools الخاصة بي فارغة. لست متأكدًا تمامًا من الإصلاح هنا ، فقد نجح كل شيء في نقطة واحدة.

لقد واجهت هذا مؤخرًا وقمت بتضييق الخطأ في حالتي إلى IntrospectionQuery ، والذي أعتقد أن Graphiql / devtools تستعلم عن خادم Graphql للمخطط؟ المشكلة هي أنني أستخدم فقط apollo-client و apollo-link-rest ، لذلك لا يوجد خادم أو مخطط ، باستثناء مخطط ذاكرة التخزين المؤقت (إذا كان هناك واحد). في المقابل ، فإن أدوات apollo devtools الخاصة بي فارغة. لست متأكدًا تمامًا من الإصلاح هنا ، فقد نجح كل شيء في نقطة واحدة.

كذلك هنا

لقد رأينا ApolloDevTools تعمل مع apollo-link-state و apollo-link-Rest في React Native Debugger ، حتى يوم الخميس الماضي. هل نحن على يقين من أن هذه لا تزال مشكلة نشطة؟ ما هي الإصدارات التي تستخدمها على @ edgars-sirokovs؟

لقد رأينا ApolloDevTools تعمل مع apollo-link-state و apollo-link-Rest في React Native Debugger ، حتى يوم الخميس الماضي. هل نحن على يقين من أن هذه لا تزال مشكلة نشطة؟ ما هي الإصدارات التي تستخدمها على @ edgars-sirokovs؟

fbartho 2.2.4

fbartho فحصه للتو مرة أخرى - إنه يعمل كيندا الآن. على الأقل ليس فارغًا بعد الآن.
ما زلت أواجه مشكلات على الرغم من عدم القدرة على تمرير عرض ذاكرة التخزين المؤقت ولا يعرض مستكشف الوثائق المخطط (لدي فقط مخطط من جانب العميل تم تمريره عبر typeDefs ).

لا أعرف ما يحتاجه مستكشف التوثيق لدعم أبولو-لينك-ريست ، لكن لن يفاجئني إذا كان هناك عمل يجب القيام به ، و / أو لن يعمل بشكل جيد أبدًا. قبول العلاقات العامة إذا كان العمل مطلوبًا هنا!

من المؤكد أن التمرير في عرض ذاكرة التخزين المؤقت يبدو وكأنه خطأ في كود ApolloDevTools ،

لكنني سعيد لأنك أحرزت تقدمًا في @ edgars-sirokovs!

لقد رأينا ApolloDevTools تعمل مع apollo-link-state و apollo-link-Rest في React Native Debugger ، حتى يوم الخميس الماضي. هل نحن على يقين من أن هذه لا تزال مشكلة نشطة؟ ما هي الإصدارات التي تستخدمها على @ edgars-sirokovs؟

أختبرها باستخدام مشروع simple ولم يعمل ، علامة التبويب Apollo DevTools متاحة ولكنها فارغة دائمًا وأحصل على الخطأ التالي. https://github.com/apollographql/apollo-link-rest/tree/master/examples/simple

fbartho لقد فعلت الشيء نفسه مع المشروع الذي أعمل به في رد فعل أصلي مع مصحح أخطاء رد فعل أصلي وحصلت على نفس المشكلة. هل يمكنك مشاركة الإعداد الخاص بك أو ما هي الإصدارات التي كنت تستخدمها؟

لقد تعلمنا اليوم أنها تعمل - ولكن ليس علامة تبويب GraphiQL ، فقط علامات التبويب الأخرى: https://github.com/apollographql/apollo-client-devtools/issues/227

نظرًا لما يبدو أنه نفس المشكلة ، لا يمكنني قراءة المخطط المحلي Docs في devtools GraphiQL.

يؤدي تشغيل استعلام الاستبطان هذا إلى عرض [object Object] في لوحة الاستجابة ، وتقارير وحدة التحكم [Network error]: TypeError: forward is not a function

{
  __schema {
    types {
      name
    }
  }
}

عميلي ليس لديه خادم Graphql:

import { ApolloClient } from 'apollo-client';
import { InMemoryCache } from 'apollo-cache-inmemory';
import { persistCache } from 'apollo-cache-persist';
import localForage from 'localforage';
import typeDefs from './schema.graphql';
import { resolvers } from './resolvers';
import { link } from './link';
import { initialState } from './initialState';
export let client;
export async function createApolloClient() {
  const cache = new InMemoryCache();
  await persistCache({ cache, storage: localForage, serialize: false });
  client = new ApolloClient({ cache, link, resolvers, typeDefs });
  window.__APOLLO_CLIENT__ = client;
  cache.writeData({ data: initialState });
  return client;
}

انظر https://spectrum.chat/apollo/apollo-link-state/client-has-typedefs-but-no-docs-in-graphiql~8a80e439-3257-4fce-a666-a1e75c3cec63

لست متأكدًا مما إذا كان هذا مرتبطًا تمامًا بحالة الاستخدام مثل الجميع أعلاه ، ولكن هذه هي نتيجة البحث الوحيدة ذات الصلة التي يمكن أن أجدها مع الخطأ الذي كنت أحصل عليه والذي حلته في النهاية.

لقد واجهت هذا الخطأ مؤخرًا عندما كنت أحاول إضافة apollo-link-rest إلى تطبيق موجود باستخدام @apollo/client .

tl؛ dr تبين أن المشكلة هي أنه لا يمكنك تمرير كل من uri و link كمعلمات خيار عند تحديد ApolloCient . بدلاً من ذلك ، يجب عليك إزالة المعلمة uri وإنشاء HttpLink باستخدام createHttpLink ثم استخدام from() لدمج الروابط الخاصة بك مع link معلمة الخيار.

قبل أن أضيف رابط الباقي ، هذا ما بدا عليه تعريفي:

import { ApolloClient, InMemoryCache } from '@apollo/client';

const client = new ApolloClient({
  uri: '/api/graphql',
  cache: new InMemoryCache(),
});

عند قراءة الوثائق ، كان لدي انطباع بأنه يجب أن أتمكن من إضافة رابط الراحة عن طريق تحديد RestLink وإضافة المعلمة link الإضافية إلى خياراتي مثل هذا:

import { ApolloClient, InMemoryCache } from '@apollo/client';
import { RestLink } from 'apollo-link-rest';

const restLink = new RestLink({
  uri: '/api',
});

const client = new ApolloClient({
  uri: '/api/graphql',
  cache: new InMemoryCache(),
  link: restLink,
});

ومع ذلك ، تسبب هذا التكوين في حدوث الخطأ TypeError: forward is not a function وتوقف العميل عن العمل.

بعد قراءة المزيد في الوثائق الموجودة على الروابط ، أدركت (على الرغم من أنني لم أتمكن من رؤيتها صراحة ، وقد تكون هناك حالات يكون فيها هذا غير صحيح) أنه لا يمكنك استخدام uri و link معلمات الخيار في تعريف ApolloClient في نفس الوقت. باستخدام هذه المعلومات الجديدة ، تمكنت من إصلاح المشكلة عن طريق إزالة المعلمة uri وإنشاء HttpLink ثم دمجتها مع RestLink باستخدام from() و نجح كل شيء أخيرًا (لاحظ أنه وفقًا للوثائق ، يجب أن يذهب RestLink قبل HttpLink ):

import {
  ApolloClient, InMemoryCache, from, createHttpLink,
} from '@apollo/client';
import { RestLink } from 'apollo-link-rest';
const httpLink = createHttpLink({
  uri: '/api/graphql',
});

const restLink = new RestLink({
  uri: '/api',
});

const client = new ApolloClient({
  cache: new InMemoryCache(),
  link: from([restLink, httpLink]),
});

شكرا crbanman لقد أنقذت يومي! 💯

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات