我正在重新配置我的 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 入门示例,除非他们将客户端设置为不接受解析器中的上下文,否则我看不出问题是什么。而且,如果客户端未设置为接受上下文,是否还有其他带有客户端设置的官方示例?
1 回答
阿波罗的战车
TA贡献1862条经验 获得超6个赞
我已经想通了这个问题。客户端配置用于SchemaLink
http 请求,上下文在SchemaLink
构造函数中传递,而不是在服务器选项中传递,因为上下文是在带有 httpLink 的 http 标头中传递的。
添加回答
举报
0/150
提交
取消