Socket.io错误挂钩到express.js

aly*_*lyx 28 javascript node.js express socket.io

我正在尝试将socket.io和express.js挂钩在一起:

var socket = require('./socket_chat/socket.js');

var express = require('express'),
    app = module.exports.app = express();

    var io = require('socket.io').listen(app);

    app.use(express.static(__dirname + '/app'));

io.sockets.on('connection', socket);
Run Code Online (Sandbox Code Playgroud)

在线:var io = require('socket.io').listen(app);我收到一个错误:

Error: You are trying to attach socket.io to an expressrequest handler function. Please pass a http.Server instance.
Run Code Online (Sandbox Code Playgroud)

有关此错误的SO/google似乎没有任何内容......

Ole*_*leg 64

你应该使用http模块:

var http = require('http');
var express = require('express'),
    app = module.exports.app = express();

var server = http.createServer(app);
var io = require('socket.io').listen(server);  //pass a http.Server instance
server.listen(80);  //listen on port 80

//now you can use app and io
Run Code Online (Sandbox Code Playgroud)

您可以在文档中找到更多详细信息:http://socket.io/docs/#using-with-express-3/4

  • 但是我们不能使用express()而不是使用http模块的原因是什么?表达'createServer()的替代方法是什么? (15认同)

Tag*_*ada 8

您可以在不使用http模块的情况下进行操作

app.listen返回可用于socket.io的服务器实例

const express = require('express');
const app = express();
const server = app.listen(port, () => {
    console.log("Listening on port: " + port);
});
const io = require('socket.io')(server);
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案,而且非常简单。谢谢! (2认同)