猿问

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

我正在重新配置我的 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 入门示例,除非他们将客户端设置为不接受解析器中的上下文,否则我看不出问题是什么。而且,如果客户端未设置为接受上下文,是否还有其他带有客户端设置的官方示例?


慕容708150
浏览 133回答 1
1回答

阿波罗的战车

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

相关分类

JavaScript
我要回答