为了账号安全,请及时绑定邮箱和手机立即绑定

GraphQL 解析器上下文在 Playground 中工作,但在官方 NextJS 入门示例中不在

GraphQL 解析器上下文在 Playground 中工作,但在官方 NextJS 入门示例中不在

慕容708150 2023-04-27 17:08:05
我正在重新配置我的 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个赞

我已经想通了这个问题。客户端配置用于SchemaLinkhttp 请求,上下文在SchemaLink构造函数中传递,而不是在服务器选项中传递,因为上下文是在带有 httpLink 的 http 标头中传递的。



查看完整回答
反对 回复 2023-04-27
  • 1 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信