如何将Express的req对象传入graphql-http的createHandler中间件
解决方案
你可以通过graphql-http的createHandler配置中的context选项,将Express的req对象传入GraphQL的处理流程中,具体修改如下:
app.use('/graphql', createHandler({ schema, // 从Express请求中提取数据并传入GraphQL上下文 context: (req) => { return { user: req.user, // 直接获取authenticate中间件赋值的req.user req: req // 也可传入完整的req对象 }; }, }));
之后在你的GraphQL resolver中,就能通过上下文参数访问到这些数据:
const resolvers = { Query: { currentUser: (parent, args, context) => { // 此处context.user即为authenticate中间件赋值的用户信息 return context.user; }, }, };
graphql-http官方文档(Express部分)中文翻译
在Express环境中,
createHandler的处理函数会直接接收Express的Request和Response对象作为参数。你可以利用这一特性自定义上下文、解析请求参数等。官方示例代码:
import express from 'express'; import { createHandler } from 'graphql-http/lib/use/express'; import { schema } from './my-graphql-schema'; const app = express(); // 挂载GraphQL请求处理路由 app.all('/graphql', createHandler({ schema })); app.listen(4000); console.log('监听端口4000');
需要注意的是,context选项是一个函数,它会接收当前的Express请求对象,你可以在这里提取需要的信息并返回,所有GraphQL resolver都能通过上下文参数访问这些数据。
内容的提问来源于stack exchange,提问作者Kristian Golemi
相关产品推荐
相关产品推荐

