Я создал службу Express / Node, которая использует ApolloClient v3 для подписки на базу данных на Hasura (база данных была создана с помощью Heroku на платформе Hasura). Я хочу подписаться на изменения базы данных с помощью ApolloClient.
Моя установка ApolloClient выглядит так (на основе Разделенные документы для общения):
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:
"@apollo/client/core", а не "@apollo/client", потому что для этого нужна зависимость от реакции (и я не хочу, чтобы это было в моей серверной службе)import ws from "ws"; для реализации веб-сокета для узла, так как это функция браузераimport "cross-fetch/polyfill";, чтобы иметь функцию выборки, которая используется ApolloClientТеперь приложение работает без ошибок, но я не знаю, почему моя подписка не работает. У меня такой же код на интерфейсе (немного другой, потому что это React), и он там хорошо работает.
Это моя логика подписки:
const observable = client.subscribe({
query: gql`
subscription {
payments() {
amount
id
time
userId
}
}
`,
});
observable.subscribe((data: any) => {
console.info("data", data);
});
Я ожидаю, что мой console.info регистрирует некоторые данные при изменении базы данных, но это не так, и моя панель Hasura Dashboard не показывает никаких новых подключений.
Как я могу установить соединение с моей базой данных через веб-сокет?





Я обнаружил, что uri WebSocket на клиенте Node.js должен начинаться с 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,
});