Apollo GraphQL服务器;设置上下文以处理由已触发的订阅触发的请求
问题描述:
我了解如何在创建GraphQL服务器时设置上下文对象,例如Apollo GraphQL服务器;设置上下文以处理由已触发的订阅触发的请求
const app = express();
app.use(GRAPHQL_URL, graphqlExpress({
schema,
context: {
foo: 'bar'
},
}));
以便在处理传入请求时将上下文对象传递给我的解析器。
但是,当解析器被订阅触发时,我没有看到这个上下文对象(即客户端订阅了GraphQL订阅,并定义了订阅触发时要发送给他们的数据的形状);在这种情况下,上下文看起来是空的对象。
有没有办法确保我的上下文对象在调用了PubSub.publish()调用后的解析器时正确设置?
答
我想你正在使用包subscription-transport-ws
。在这种情况下,可以在不同的执行步骤中添加上下文值。 见API。两种可能的情况
如果您有某种认证。您可以在
onConnect
执行步骤的上下文中添加查看器。这是在第一次连接到websocket时完成的,并且在连接关闭并再次打开之前不会改变。见example。如果你想更多的动态添加一个背景下,你可以在执行step.It前添加一种中间件看起来是这样的:
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",
},);
许多感谢你的回应;中间件interceptit绝对是我需要去的方式,因为我需要根据“触发事件”中的信息修改上下文。 – wabrit
然而,它似乎并没有为我工作 - 如果我以上面建议的方式定义我自己的执行功能,我可以看到它被设置到订阅服务器,但它从来没有打我的方法,并总是通过**标准** graphql execute()方法。查看'graphql \ subscription \ subscribe:subscribeImpl()'它似乎总是调用'graphql \ execution \ execute.js'中的默认值。 – wabrit
好吧,我想我没有正确理解你的问题。你在客户端订阅。并且在订阅中添加一个参数,说明结果应该是什么样子? –