[英]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.