我正在重新配置我的 NextJS/Apollo 应用程序以允许使用 GraphQL API 路由的 SSG,并且我正在使用这个官方 NextJS 入门示例作为客户端配置的基础。
我在自己的应用程序中遇到了一个有趣的问题,所以我回到了入门示例并尝试重现它,并且能够重现。问题是,如果没有任何上下文对象传递到查询解析器,一切都可以正常工作(在操场上和客户端上)。但是,当您引入上下文对象并将其传递给解析器时,它在 playground 中工作正常,但上下文对象是undefined
从客户端触发的。这是来自官方 NextJS 入门示例的代码,我将在添加任何内容的地方进行评论。
graphql.js
import { 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.js
import { gql } from '@apollo/client'
export const typeDefs = gql`
type User {
id: ID!
name: String!
status: String!
}
type Query {
viewer: User
}
`
schema.js
import { makeExecutableSchema } from 'graphql-tools'
import { typeDefs } from './type-defs'
import { resolvers } from './resolvers'
export const schema = makeExecutableSchema({
typeDefs,
resolvers,
})
resolvers.js
export 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.js
import 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 入门示例,除非他们将客户端设置为不接受解析器中的上下文,否则我看不出问题是什么。而且,如果客户端未设置为接受上下文,是否还有其他带有客户端设置的官方示例?
阿波罗的战车
相关分类