如何为socket io和graphql建立连接?

Dar*_*ght 6 node.js socket.io graphql

我对graphql很陌生……这是我的服务器文件……我无法建立socket io连接……当我在socket io内执行控制台时,它不会进入函数内部……我想我我在这里做错了什么const io = require('socket.io')(server)......

var express = require('express');
var graphqlHTTP = require('express-graphql');
var {schema} = require('../graphql/schema');
var {root} = require('../graphql/resolver');

const EventEmitter = require('events');
var app = express();
var server = require('http').Server(app);
const event = new EventEmitter()
const io = require('socket.io')(server)
event.on('event', function(action) {
  console.log(action)
  io.on('connection', function (socket) {
    console.log('socket')
    socket.emit('action', action)
  })
})

app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: root,
  graphiql: true,
  formatError(err) {
    return {
      message: err.message
    };
  }
}));
app.use('/voyager', middleware({ endpointUrl: '/graphql' }));
app.listen(3019);
Run Code Online (Sandbox Code Playgroud)

Wil*_*iam 4

apollo 服务器- “...是使用任何来源的数据为 GraphQL 客户端快速构建生产就绪、自记录 API 的最佳方式。”

apollo-server-express - 使用 apollo 作为应用程序变量的“中间件”

// Node modules imports
require('dotenv').config({ path: './variables.env' })
const express = require('express')
const socketio = require('socket.io')
const { ApolloServer, gql } = require('apollo-server-express')

// Initalizes the app server
const app = express()

const typeDefs = gql`
  type Query {
    foo: String
  }
`;

const resolvers = {
  Query: {
    foo: () => 'Foo world!'
  },
};

const server = new ApolloServer({ typeDefs, resolvers });
server.applyMiddleware({ app });


// Listen to port 5000, save on const to attach io to it
const http = app.listen(5000, () =>
  console.log(" Server ready at http://localhost:5000" + server.graphqlPath)
)

// Attach socket.io to the server instance
const io = socketio(http)
io.on('connection', (socket) => {
   // related io code
})
Run Code Online (Sandbox Code Playgroud)

我强烈建议您阅读apollo的文档

更新@Coder

请记住始终将所有 io 代码包装在 io.connection 的连接方法中。
顺便说一句,您正在创建两个服务器实例,一个是 Express,一个是 Http。
将express中的服务器存储到const中并将其用于socket.io。

const app = express()
const server = app.listen(3019)

const io = require('socket.io')(server)
io.on('connection', (socket) => {
    console.log('connected to socket')
    // do event here inside
    // enter code here
    socket.on('some_event',()=>{ // do something })
    socket.on('some_event_2',()=>{ // do something 2 })
    socket.on('some_event_3',()=>{ // do something 3 })
})
Run Code Online (Sandbox Code Playgroud)