我了解如何在创建 GraphQL 服务器时设置上下文对象,例如
const app = express();
app.use(GRAPHQL_URL, graphqlExpress({
schema,
context: {
foo: 'bar'
},
}));
以便在处理传入请求时将上下文对象传递到我的解析器。
但是,当解析器被订阅触发时,我没有看到这个上下文对象(即客户端订阅 GraphQL 订阅,并定义订阅触发时要发送给它们的数据的形状);在这种情况下,上下文似乎是一个空对象。
在 PubSub.publish() 调用之后调用解析器时,有没有办法确保正确设置我的上下文对象?
最佳答案
我猜你正在使用包 subscription-transport-ws
。在这种情况下,可以在不同的执行步骤中添加上下文值。
参见 API .两种可能的情况
如果您有某种身份验证。您可以在
onConnect
执行步骤的上下文中添加查看器。这是在第一次连接到 websocket 时完成的,并且在连接关闭并再次打开之前不会改变。参见 example .如果您想更动态地添加上下文,您可以在执行步骤之前添加一种中间件。它可能如下所示:
const middleware = (args) => new Promise((resolve, reject) => {
const [schema, document, root, context, variables, operation] = args;
context.foo = "bar"; // add something to context
resolve(args);
})
subscriptionServer = SubscriptionServer.create({
schema: executable.schema,
subscribe,
execute: (...args) => middleware(args).then(args => {
return execute(...args);
})
}, {
server: websocketServer,
path: "/graphql",
}, );
关于graphql - Apollo GraphQL 服务器;设置上下文以处理由已触发订阅触发的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45574592/