繁体   English   中英

GraphQL 使用 Express-GraphQL 的订阅

[英]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-wsApollo Sandbox

然后我的订阅创建选项如下。

其中createScopedPermissionWrapper只是一个execute包装器,带有@graphql-authzcreateGraphqlContext工厂 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}`
  )
}

请参见身份验证和 Express 中间件

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM