簡體   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