我正在重新配置我的 NextJS/Apollo 應用程序以允許使用 GraphQL API 路由的 SSG,并且我正在使用這個官方 NextJS 入門示例作為客戶端配置的基礎。我在自己的應用程序中遇到了一個有趣的問題,所以我回到了入門示例并嘗試重現它,并且能夠重現。問題是,如果沒有任何上下文對象傳遞到查詢解析器,一切都可以正常工作(在操場上和客戶端上)。但是,當您引入上下文對象并將其傳遞給解析器時,它在 playground 中工作正常,但上下文對象是undefined從客戶端觸發的。這是來自官方 NextJS 入門示例的代碼,我將在添加任何內容的地方進行評論。graphql.jsimport { ApolloServer } from "apollo-server-micro";import { schema } from "../../apollo/schema";const apolloServer = new ApolloServer({ schema, context: { // foo: "bar", // this is the context object I've added }, //});export const config = { api: { bodyParser: false, },};export default apolloServer.createHandler({ path: "/api/graphql" });typedefs.jsimport { gql } from '@apollo/client'export const typeDefs = gql` type User { id: ID! name: String! status: String! } type Query { viewer: User }`schema.jsimport { makeExecutableSchema } from 'graphql-tools'import { typeDefs } from './type-defs'import { resolvers } from './resolvers'export const schema = makeExecutableSchema({ typeDefs, resolvers,})resolvers.jsexport const resolvers = { Query: { viewer: (_parent, _args, context, _info) => { console.log("context", context); // console log check that I've added return { id: 1, name: "John Smith", status: "cached" }; }, },};當我在 GraphQL playground 中運行它并查詢 API 時,它給了我正確的響應,并且在我的終端控制臺中它foo: bar從控制臺日志返回上下文對象,因此在服務器中正確傳遞了上下文對象。但是,當我在瀏覽器中訪問索引頁面時,是這樣的:index.jsimport gql from "graphql-tag";import Link from "next/link";import { useQuery } from "@apollo/client";import { initializeApollo } from "../apollo/client";const ViewerQuery = gql` query ViewerQuery { viewer { id name status } }...呈現查看器名稱和查看器狀態,因此查詢實際上正在發生,但在控制臺中,context對象控制臺日志正在返回undefined。所以當在客戶端使用時,context不知何故丟失了。我覺得這很有趣,因為這是一個正式的 NextJS 入門示例,除非他們將客戶端設置為不接受解析器中的上下文,否則我看不出問題是什么。而且,如果客戶端未設置為接受上下文,是否還有其他帶有客戶端設置的官方示例?
GraphQL 解析器上下文在 Playground 中工作,但在官方 NextJS 入門示例中不在
慕容708150
2023-04-27 17:08:05