如何扩展 GraphQL 调用的上下文对象?

我在标准模块中有以下 GraphQL 服务器调用:


export default () => {

    return graphqlHTTP({

        schema: schema,

        graphiql: true,

        pretty: true,

        formatError: error => ({

            message: error.message,

            locations: error.locations,

            stack: error.stack,

            path: error.path

        })

    });

};

与护照一起使用:


app.use(

    "/graphql",

    passport.authenticate("jwt", { session: false }),

    appGraphQL()

);

一切都是工作文件。Passport 扩展了 myreq以获取在我的 GraphQL 调用查询或更改时使用的已记录用户对象:


...

    resolve(source, args, context) {

        console.log("CURRENT USER OBJECT")

        console.log(context.user)

...

一切都很好。


现在我需要扩展我的上下文以添加一些自定义解析器,所以我的第一次尝试是:


export default () => {

    return graphqlHTTP({

        schema: schema,

        graphiql: true,

        pretty: true,

        context: resolvers,

        formatError: error => ({

            message: error.message,

            locations: error.locations,

            stack: error.stack,

            path: error.path

        })

    });

};

正如 GraphQL 文档所说,这会覆盖原始的 req 上下文,并且 my context.useron 查询和突变停止工作。


如何正确扩展当前上下文以添加更多字段,而不是覆盖它?另一个不成功的尝试:


export default (req) => {

    return graphqlHTTP({

        schema: schema,

        graphiql: true,

        pretty: true,

        context: {

            user: req.user,

            resolvers: resolvers

        },

        formatError: error => ({

            message: error.message,

            locations: error.locations,

            stack: error.stack,

            path: error.path

        })

    });

};

这种方法不起作用......我收到以下错误:


  user: req.user,

                ^


TypeError: Cannot read property 'user' of undefined



GCT1015
浏览 162回答 1
1回答

慕的地10843

假设您使用的是express-graphql,graphqlHTTP是一个函数,它接受一些配置参数并返回一个快速中间件函数。通常,它是这样使用的:app.use(  '/graphql',  graphqlHTTP({ ... }))但是,graphqlHTTP 也可以采用返回对象的函数,而不是对象,如docs所示。app.use(  '/graphql',  graphqlHTTP((req, res, graphQLParams) => {    return { ... }  }))通过这种方式,您可以在配置对象中使用req,res或graphQLParams参数。app.use(  '/graphql',  graphqlHTTP((req, res, graphQLParams) => {    return {      schema,      // other options      context: {        user: req.user,        // whatever else you want      }    }  }))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript