[英]GraphQL Subscriptions using Express-GraphQL
誰能告訴我如何在 Node 中使用Express-GraphQL實現GraphQL 訂閱?
我也遇到了同樣的問題。 我無法在文檔中找到明確的解決方案。 所以我剛改用 graphql-yoga。 但我確實找到了這個線程所以一定要檢查一下
我一直在研究同樣的問題。
我已經閱讀了 GitHub 的express-graphql
訂閱問題,並且該回購協議的成員建議在結束評論中使用graphql-ws
。
這是我的 GitHub 項目shammelburg/express-graphql-api的鏈接,您可以npm start
加載 grapiql 來測試查詢和變異。
為了測試訂閱,我創建了一個 Angular 項目,它實現graphql-ws
的 observables 示例。 shammelburg/graphql-rxjs-角度
Angular 項目也使用graphql-request
進行查詢和修改。
這是一個非常輕量級的解決方案,並且可以完美運行。
他們在 2020 年 11 月添加了提及訂閱支持的文檔片段以及示例實現。但不幸的是,它從未發布過, 這里有一個問題提到了這一點。
我現在的解決方法是為subscriptions-transport-ws
套接字切換到Express Playground (Playground 還不支持graphql-ws
),為graphql-ws
到Apollo Sandbox 。
然后我的訂閱創建選項如下。
其中createScopedPermissionWrapper
只是一個execute
包裝器,帶有@graphql-authz
和createGraphqlContext
工廠 function 驗證身份驗證並為我的解析器創建自定義上下文。
import { Server } from 'http'
import { useServer } from 'graphql-ws/lib/use/ws' // subscription with graphql-ws
import { SubscriptionServer } from 'subscriptions-transport-ws' // subscription with subscriptions-transport-ws
export const createSubscriptionsTransportWs = (server: Server) => {
const wsServer = new SubscriptionServer(
{
schema,
execute: createScopedPermissionWrapper(),
subscribe,
onConnect: (args: { authentication?: string }) =>
createGraphqlContext({
authentication: args.authentication,
}),
},
{ server, path }
)
const wsAddress = wsServer.server.address() as AddressInfo
depClients.logger.success(
`Graphql subscription socket up on ${wsAddress.address}:${wsAddress.port}${path}`
)
}
export const createGraphqlWS = (server: Server) => {
const wsServer = new ws.Server({ server, path })
useServer(
{
schema,
execute: createScopedPermissionWrapper(),
subscribe,
context: (args: { connectionParams: { authentication?: string } }) =>
createGraphqlContext({
authentication: args.connectionParams.authentication,
}),
},
wsServer
)
const wsAddress = wsServer.address() as AddressInfo
depClients.logger.success(
`Graphql subscription socket up on ${wsAddress.address}:${wsAddress.port}${path}`
)
}
var express = require('express');
var graphqlHTTP = require('express-graphql');
var { buildSchema } = require('graphql');
var schema = buildSchema(`
type Query {
ip: String
}
`);
const loggingMiddleware = (req, res, next) => {
console.log('ip:', req.ip);
next();
}
var root = {
ip: function (args, request) {
return request.ip;
}
};
var app = express();
app.use(loggingMiddleware);
app.use('/graphql', graphqlHTTP({
schema: schema,
rootValue: root,
graphiql: true,
}));
app.listen(4000);
console.log('Running a GraphQL API server at localhost:4000/graphql');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.