Я пытаюсь создать базовое c приложение, похожее на чат, просто для изучения нескольких вещей.
Я настроил базовый c сервер Graphql для обработки подключения пользователя и позвольте им добавить сообщение. Сейчас я пытаюсь добавить некоторый механизм, чтобы каждый пользователь мог видеть сообщения друг друга, добавленные в режиме реального времени. Я новичок в GraphQL, но, похоже, я должен использовать подписки.
Вот мой сервер index.ts:
import { createServer } from 'http';
import jwt from 'jsonwebtoken';
import mongoose from 'mongoose';
import resolvers from 'modules/resolvers';
import typeDefs from 'modules/type-defs';
import { ApolloServer } from 'apollo-server-express';
import cookieParser from 'cookie-parser';
import express from 'express';
import cors from 'cors';
const PORT = 4000;
const getUser = (token: string) => {
// ...
};
const server = new ApolloServer({
context: ({ req, res }) => {
const token = req.cookies.jwt;
const currentUser = getUser(token);
return { currentUser, req, res };
},
resolvers,
subscriptions: {
onConnect: async (connectionParams, webSocket, context) => {
console.log(`Subscription client connected using Apollo server's built-in SubscriptionServer.`)
},
onDisconnect: async (webSocket, context) => {
console.log(`Subscription client disconnected.`)
},
},
typeDefs,
});
const app = express();
const httpServer = createServer(app);
app.use(cors({ credentials: true, origin: 'http://localhost:3000' }));
app.use(cookieParser());
server.applyMiddleware({ app, cors: false });
server.installSubscriptionHandlers(httpServer);
httpServer.listen(PORT, () => {
console.log(`Server ready at http://localhost:${PORT}${server.graphqlPath}`);
console.log(`Subscriptions ready at ws://localhost:${PORT}${server.subscriptionsPath}`);
});
mongoose.connect('mongodb://127.0.0.1:27017/irc', {
useCreateIndex: true,
useNewUrlParser: true,
useUnifiedTopology: true,
});
Я пытаюсь что-то настроить настолько простой, насколько это возможно, на стороне клиента (javascript / реагировать) без необходимости полагаться на библиотеку типа apollo-client. Мне удалось использовать простые вызовы извлечения для отправки запросов / мутаций, и я ожидал, что смогу использовать подписки также «простым» способом. Apollo-client кажется слишком сложным для того, что я пытаюсь сделать, и я хотел бы понять, как это на самом деле работает - но каждый учебник по подпискам, похоже, использует эту библиотеку ...
Я не очень понять, что на самом деле делает мой сервер в отношении подписок, и я подумал, что настроил его на прослушивание подключений к веб-сокетам, но я больше не уверен в этом. что произойдет:
const ws = new WebSocket('ws://localhost:4000/graphql');$
ws.onopen = event => {
ws.send('Lorem ipsum dolor sit amet.');
};
... но, несмотря на то, что моя вкладка сети chrome показывает, что все прошло нормально, мой сервер, похоже, не заботится о моем сообщении, поскольку ничего не регистрируется.
Может кто-нибудь объяснить, можно ли использовать веб-сокеты basi c для использования подписок на сервер apollo? И как?
Спасибо