2017-08-08 114 views
1

我了解如何在创建GraphQL服务器时设置上下文对象,例如Apollo GraphQL服务器;设置上下文以处理由已触发的订阅触发的请求

const app = express(); 
app.use(GRAPHQL_URL, graphqlExpress({ 
      schema, 
      context: { 
       foo: 'bar' 
      }, 
    })); 

以便在处理传入请求时将上下文对象传递给我的解析器。

但是,当解析器被订阅触发时,我没有看到这个上下文对象(即客户端订阅了GraphQL订阅,并定义了订阅触发时要发送给他们的数据的形状);在这种情况下,上下文看起来是空的对象。

有没有办法确保我的上下文对象在调用了PubSub.publish()调用后的解析器时正确设置?

回答

0

我想你正在使用包subscription-transport-ws。在这种情况下,可以在不同的执行步骤中添加上下文值。 见API。两种可能的情况

  1. 如果您有某种认证。您可以在onConnect执行步骤的上下文中添加查看器。这是在第一次连接到websocket时完成的,并且在连接关闭并再次打开之前不会改变。见example

  2. 如果你想更多的动态添加一个背景下,你可以在执行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", 
 
},);

+0

许多感谢你的回应;中间件interceptit绝对是我需要去的方式,因为我需要根据“触发事件”中的信息修改上下文。 – wabrit

+0

然而,它似乎并没有为我工作 - 如果我以上面建议的方式定义我自己的执行功能,我可以看到它被设置到订阅服务器,但它从来没有打我的方法,并总是通过**标准** graphql execute()方法。查看'graphql \ subscription \ subscribe:subscribeImpl()'它似乎总是调用'graphql \ execution \ execute.js'中的默认值。 – wabrit

+0

好吧,我想我没有正确理解你的问题。你在客户端订阅。并且在订阅中添加一个参数,说明结果应该是什么样子? –