首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >graphql代理-无法连接到websocket

graphql代理-无法连接到websocket
EN

Stack Overflow用户
提问于 2022-07-16 15:34:32
回答 1查看 57关注 0票数 0

我对整个graphql非常陌生,并且尝试创建订阅,但是当我尝试运行其中一个订阅时,我会看到下面的错误

无法连接到websocket端点ws://localhost:3000/graphql。请检查端点url是否正确。

下面的示例是在这个https://www.apollographql.com/docs/apollo-server/data/subscriptions中,目前我的代码如下所示

代码语言:javascript
复制
const { createServer } = require('http')
const express = require('express')
const { ApolloServer } = require('apollo-server-express')
const { ApolloServerPluginDrainHttpServer } = require('apollo-server-core')
const { PubSub } = require('graphql-subscriptions')
const { WebSocketServer } = require('ws')
const { useServer } = require('graphql-ws/lib/use/ws')
const { env } = require('../config/index')
const schema = require('./schema')
const models = require('../db/models')
const getAuthUser = require('../utils/authorization')

const pubSub = new PubSub()
const app = express()
const httpServer = createServer(app)
const wsServer = new WebSocketServer({ server: httpServer, path: '/graphql' })
const serverCleanup = useServer({ schema }, wsServer)
const server = new ApolloServer({
    schema,
    csrfPrevention: true,
    cache: 'bounded',
    plugins: [
        // Proper shutdown for the HTTP server.
        ApolloServerPluginDrainHttpServer({ httpServer }),

        // Proper shutdown for the WebSocket server.
        {
            async serverWillStart() {
                return {
                    async drainServer() {
                        await serverCleanup.dispose()
                    },
                }
            },
        },
    ],
    playground: env.development,
    context: async ({ req }) => {
        const token = req.headers.authorization
        const user = getAuthUser(token)
        return { models, user, pubSub }
    },
})
server.applyMiddleware({ app })
server.installSubscriptionHandlers(httpServer)
module.exports = { server, httpServer }

在另一个文件中,我有httpServer.listen(port)提供任何提示或解释为什么会发生这种情况?

EN

回答 1

Stack Overflow用户

发布于 2022-07-16 15:47:44

试试这个方法https://github.com/iam-hussain/gql-server/blob/master/src/providers/Engine.ts

代码语言:javascript
复制
import express from "express";
import http from "http";
import { ApolloServer } from "apollo-server-express";
import { ApolloServerPluginDrainHttpServer } from "apollo-server-core";
import { makeExecutableSchema } from '@graphql-tools/schema';
import { WebSocketServer } from 'ws';
import { useServer } from 'graphql-ws/lib/use/ws';

import typeDefs from "../graphql/schema/index";
import resolvers from "../graphql/resolvers/index";
import context from "../graphql/context";
import { PORT } from "./Configs";

const schema = makeExecutableSchema({
  typeDefs,
  resolvers,
});

const serverInit = async () => {
  let app = express();

  // HTTP :: Creating HTTP server...
  const httpServer = http.createServer(app);
  // WebSocketServer :: Creating web socket server...
  const wsServer = new WebSocketServer({
    port: 4000,
    path: '/graphql',
  });
  // Save the returned server's info so we can shut down this server later
  const serverCleanup = useServer({ schema }, wsServer);
  
  // Apollo :: Creating Apollo server...
  const server = new ApolloServer({
    schema,
    context,
    plugins: [ApolloServerPluginDrainHttpServer({ httpServer }), {
      async serverWillStart() {
        return {
          async drainServer() {
            await serverCleanup.dispose();
          },
        };
      },
    }],
  });

  // Apollo :: Staring Apollo server...
  await server.start();
  server.applyMiddleware({
    app,
    path: "/graphql",
  });

  app.listen(PORT, () => {
    console.log(` GraphQL ready at http://localhost:${PORT}${server.graphqlPath}`);
    return console.log(`Listening :: Server is running @ ${PORT}`);
  });

  return app;
};


serverInit();

参考资料:

https://github.com/iam-hussain/gql-server

  • 后端
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73005479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档