如何建立Socket.io和GraphQL的连接?

7

我对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);

也许你已经解决了这个问题。请注意,除非事件被触发,否则不会建立套接字连接。如果连接未建立,则不会发出操作。 - Luis
@Luis 谢谢你的回答,Luis。 - Dark Knight
@DarkKnight,你有没有找到不使用Apollo的解决方案?我也遇到了同样的问题。 - MrfksIV
2个回答

4

Apollo Server - 是快速构建适用于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
})

我强烈推荐您阅读 Apollo 的文档。

更新给 @Coder:

请记得始终在 io 连接方法中包装您的所有 I/O 代码。
另外,您正在创建两个服务器实例,一个是 Express,一个是 Http。
将 express 的服务器存储到常量中,并将其用于 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 })
})

1
请尝试解释一下这将如何解决手头的问题。 - Coder

1

使用 Express 的 app.listen() 不被 Socket.IO 文档推荐,你可以使用这个代替

const http = require("http");
const app = express();
const httpServer = createServer(app);
const io = require('socket.io')(httpServer);
io.on("connection", (socket) => {
  console.log("Connected");
  // your code
});
httpServer.listen(PORT, () =>
  console.log(`Server stated on http://127.0.0.1:${PORT}/`)
);

你可以参考这个socket.io文档,其中包含有关与express相关的部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接