2017-08-08 64 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

好吧,我想我沒有正確理解你的問題。你在客戶端訂閱。並且在訂閱中添加一個參數,說明結果應該是什麼樣子? –