首页 > 解决方案 > 与 Hasura 的 WebSocket 连接不适用于 Node.js 上的 ApolloClient v3

问题描述

我创建了一个 Express/Node 服务,它使用 ApolloClient v3 订阅 Hasura 上的数据库(数据库是在 Hasura 平台上使用 Heroku 创建的)。我想用 ApolloClient 订阅数据库更改。

我的 ApolloClient 设置如下所示(受Split Communication Docs启发):

import express, { Request, Response } from "express";
import "cross-fetch/polyfill";
import ws from "ws";

import {
  ApolloClient,
  HttpLink,
  InMemoryCache,
  split,
  gql,
} from "@apollo/client/core";
import { WebSocketLink } from "@apollo/client/link/ws";
import { getMainDefinition } from "@apollo/client/utilities";

const app = express();
const port = 8080;

const httpLink = new HttpLink({
  uri: "https://my.hasura.app/v1/graphql",
  fetch,
});

const wsLink = new WebSocketLink({
  uri: "ws://my.hasura.app/v1/graphql",
  options: {
    reconnect: true,
  },
  webSocketImpl: ws,
});

const splitLink = split(
  ({ query }) => {
    const definition = getMainDefinition(query);
    return (
      definition.kind === "OperationDefinition" &&
      definition.operation === "subscription"
    );
  },
  wsLink,
  httpLink
);

const client = new ApolloClient({
  link: splitLink,
  cache: new InMemoryCache(),
});

我已经发现将 ApolloClient 与 Node.js 一起使用的事情:

现在应用程序运行没有错误,但我不知道为什么我的订阅不起作用。我在前端有相同的代码(有点不同,因为它是 React)并且在那里运行良好。

这是我的订阅逻辑:

const observable = client.subscribe({
  query: gql`
    subscription {
      payments() {
        amount
        id
        time
        userId
      }
    }
  `,
});

observable.subscribe((data: any) => {
  console.log("data", data);
});

我期待我console.log正在记录一些数据,当数据库发生变化时 - 但它没有,我的 Hasura Dashboard 没有列出新的连接。如何建立到我的数据库的 websocket 连接?

标签: node.jswebsocketgraphqlapollo-clienthasura

解决方案


我发现,Node.js 客户端上的 WebSocket uri 必须以http/https而不是ws/wws.

使用此代码,它现在可以工作:

const wsLink = new WebSocketLink({
  uri: "https://my.hasura.app/v1/graphql",  // instead of "ws://my.hasura.app/v1/graphql"
  options: {
    reconnect: true,
  },
  webSocketImpl: ws,
});

推荐阅读