websocket 订阅服务器不工作。无法到达订阅服务器 graphql-ws ws

问题描述 投票:0回答:2

我遵循[相同的文档代码][1]使用websocket graphql创建订阅服务器,但它不适用于graphql-ws和ws 当我删除 serverCleanup 定义时,代码有效,并且它也适用于旧的订阅库“subscription-transport-ws” 我的index.js

const { ApolloServer } = require('apollo-server-express')
const { ApolloServerPluginDrainHttpServer } = require('apollo-server-core')
const express = require('express')
const http = require('http')
const { makeExecutableSchema } = require('@graphql-tools/schema')
const { upperDirectiveTransformer } = require('./directives/uppercase')
const { WebSocketServer } = require ('ws');
const { useServer } = require('graphql-ws/lib/use/ws');
const { typeDefs } = require('./typeDefs')
const { resolvers } = require('./resolvers')
const jwt = require('jsonwebtoken');
const JWT_SECRET = 'f1BtnWgD3VKY';
const users = [
 {
    "id":1,
    "name":"Magdalena",
    "email":"[email protected]",
    "gender":"male",
    "mobile":"734-324-1043",
    "cumulativeGPA":92.1,
    "isGraduated":true,
    "friends":[
       {
          "name":"Magdalena",
          "email":"[email protected]",
          "gender":"male",
          "mobile":"734-324-1043",
          "cumulativeGPA":92.1
       },
       {
          "name":"Harman",
          "email":"[email protected]",
          "gender":"male",
          "mobile":"158-265-8979",
          "cumulativeGPA":87.9
       },
       {
          "name":"Oliver",
          "email":"[email protected]",
          "gender":"female",
          "mobile":"500-958-5193",
          "cumulativeGPA":67.9
       }
    ],
    "age":28,
    "image" : {"name":"ghklk.png", "height": 50 , "width":30},
    "idea": "auction",
    "grantedAmount": 12000
 },
 {
    "id":2,
    "name":"Lyndell",
    "email":"[email protected]",
    "gender":"male",
    "mobile":"165-705-3521",
    "cumulativeGPA":90.6,
    "isGraduated":false,
    "friends":[
       {
          "name":"Magdalena",
          "email":"[email protected]",
          "gender":"male",
          "mobile":"734-324-1043",
          "cumulativeGPA":92.1
       },
       {
          "name":"Harman",
          "email":"[email protected]",
          "gender":"male",
          "mobile":"158-265-8979",
          "cumulativeGPA":87.9
       },
       {
          "name":"Oliver",
          "email":"[email protected]",
          "gender":"female",
          "mobile":"500-958-5193",
          "cumulativeGPA":67.9
       }
    ],
    "age":23,
    "image" : {"name":"ghklk.png", "height": 50, "width":30},
    "idea": "e-collage",
    "grantedAmount": 0
 },
 ]

async function startApolloServer(typeDefs, resolvers) {
    const app = express()
    const httpServer = http.createServer(app)

    let schema = makeExecutableSchema({
        typeDefs,
        resolvers
    })

    schema = upperDirectiveTransformer(schema, 'upper')

    const wsServer = new WebSocketServer({
        server: httpServer, 
        path: '/graphql'
    })
    const serverCleanup = useServer({ schema }, wsServer);

    const server = new ApolloServer({
        schema,
        plugins: [
            ApolloServerPluginDrainHttpServer({ httpServer }),
            {
                async serverWillStart() {
                  return {
                    async drainServer() {
                        serverCleanup.dispose();
                    }
                  }
                }
            }
        ],
        context: ({ req }) => {
            const auth = req ? req.headers.authorization : null 
            try{
                const decodedToken = jwt.verify(auth.slice(4), JWT_SECRET)
                const user = users.find(user => user.id == decodedToken.id)
                return { user }
            }catch(err){
                return null
            }
        }
    })

    await server.start()
    server.applyMiddleware({ app })
    await new Promise(resolve => httpServer.listen({ port: 4000 }, resolve))
    console.log(`🚀 Server ready at http://localhost:4000${server.graphqlPath}`);
    return { server, app }
}

startApolloServer(typeDefs, resolvers)

我的resolvers.js

const users = [
 {
    "id":1,
    "name":"Magdalena",
    "email":"[email protected]",
    "gender":"male",
    "mobile":"734-324-1043",
    "cumulativeGPA":92.1,
    "isGraduated":true,
    "friends":[
       {
          "name":"Magdalena",
          "email":"[email protected]",
          "gender":"male",
          "mobile":"734-324-1043",
          "cumulativeGPA":92.1
       },
       {
          "name":"Harman",
          "email":"[email protected]",
          "gender":"male",
          "mobile":"158-265-8979",
          "cumulativeGPA":87.9
       },
       {
          "name":"Oliver",
          "email":"[email protected]",
          "gender":"female",
          "mobile":"500-958-5193",
          "cumulativeGPA":67.9
       }
    ],
    "age":28,
    "image" : {"name":"ghklk.png", "height": 50 , "width":30},
    "idea": "auction",
    "grantedAmount": 12000
 },
 {
    "id":2,
    "name":"Lyndell",
    "email":"lgilbee[email protected]",
    "gender":"male",
    "mobile":"165-705-3521",
    "cumulativeGPA":90.6,
    "isGraduated":false,
    "friends":[
       {
          "name":"Magdalena",
          "email":"[email protected]",
          "gender":"male",
          "mobile":"734-324-1043",
          "cumulativeGPA":92.1
       },
       {
          "name":"Harman",
          "email":"[email protected]",
          "gender":"male",
          "mobile":"158-265-8979",
          "cumulativeGPA":87.9
       },
       {
          "name":"Oliver",
          "email":"[email protected]",
          "gender":"female",
          "mobile":"500-958-5193",
          "cumulativeGPA":67.9
       }
    ],
    "age":23,
    "image" : {"name":"ghklk.png", "height": 50, "width":30},
    "idea": "e-collage",
    "grantedAmount": 0
 }]
const { PubSub } = require('graphql-subscriptions')
const pubSub = new PubSub()
const resolvers = {
    Gender: {
      MALE: 'male',
      FEMALE: 'female',
    },
    Query: {
      getUserByID: (_, {id}) => users.find(user => user.id == id),
      users: () => users,
    },
    Mutation: {
      createUser: async (_, args) => {
        if (users.find(user => user.email === args.email)) {
          throw new Error('user already exist')
        }
        const user = { ...args, id: users.length + 1 };
        users = users.concat(user);
        pubSub.publish('USER_ADDED', { userAdded: user })
        return user
      }
    },
    Subscription: {
      userAdded: {
        subscribe: () => pubSub.asyncIterator(['USER_ADDED']),
      }
    }
};

module.exports = { resolvers };

typeDefs.js

const { gql } = require('apollo-server-express');

const typeDefs = gql`
    type User {
        id: ID!
        name: String!
        email: String!
        gender: Gender!
        mobile: String!
        cumulativeGPA:Float!
        isGraduated: Boolean
        friends: [Friend]!
        age: Int!
        image: Image
    }

    enum Gender {
        MALE
        FEMALE
    }

    type Friend{
        name: String!
        email: String!
        gender: Gender!
        mobile: String!
        cumulativeGPA:Float!
    }

    type Image{
        name: String!
        height: Int!
        width: Int!
    }

    type Query {
        users: [User]
        getUserByID(id: ID!): User
    }

    type Mutation {
        createUser(
            name: String!
            email: String!
            gender: Gender!
            mobile: String!
            cumulativeGPA:Float!
            isGraduated: Boolean
            friends: [FriendInput]!
            age: Int!
            image: ImageInput
        ): User
    }

    type Subscription {
        userAdded: User
    }

    input ImageInput{
        name: String!
        height: Int!
        width: Int!
    }

    input FriendInput{
        name: String!
        email: String!
        gender: Gender!
        mobile: String!
        cumulativeGPA:Float!
    }

`;

module.exports = { typeDefs };

没有客户端,只是我需要在 apollo-sandbox 上尝试从服务器端订阅 [1]:https://www.apollographql.com/docs/apollo-server/data/subscriptions/

websocket graphql subscription apollo-server ws
2个回答
11
投票

我遇到了类似的问题,对我有用的是:

  1. 进入 Apollo Studio 沙盒中的“资源管理器设置”(齿轮图标)。
  2. 点击“编辑”
  3. 将“订阅”端点设置为“ws://localhost:4000/graphql”
  4. 将“实现”更改为“graphql-ws”
  5. 保存并再次尝试您的订阅操作

0
投票

{ "message": "无法构造'WebSocket':可能无法从通过 HTTPS 加载的页面发起不安全的 WebSocket 连接。" }

© www.soinside.com 2019 - 2024. All rights reserved.