如何使用Socket.io结合Express.JS(使用Express应用程序生成器)

时间:2016-11-22 17:15:08

标签: javascript node.js express socket.io

我正在尝试将Socket.io与Express.JS结合使用(使用Express应用程序生成器) 我发现了一些aswers如何做到这一点(Using socket.io in Express 4 and express-generator's /bin/www)。我的问题是我无法使用routes文件夹中的套接字。 我可以在app.js和bin / www.js文件中使用它们。当我调用路由index.js时,它只是长时间加载网页而不会出现任何错误。

仓/ www.js

...
/**
 * Create HTTP server.
 */

var server = http.createServer(app);

var io     = app.io
io.attach( server );
...

app.js

...
// Express
var app = express();

// Socket.io
var io = socket_io();
app.io = io;
var routes = require('./routes/index')(io);
...

路由/ index.js

module.exports = function(io) {
    var app = require('express');
    var router = app.Router();

    io.on('connection', function(socket) {
        console.log('User connected');
    });

    return router;
}

2 个答案:

答案 0 :(得分:2)

这是一个关于如何使用Socket.io和Express的简单示例,我在GitHub上提供了这个:

后端代码是这样的:

var path = require('path');
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', (req, res) => {
  console.error('express connection');
  res.sendFile(path.join(__dirname, 'si.html'));
});
io.on('connection', s => {
  console.error('socket.io connection');
  for (var t = 0; t < 3; t++)
    setTimeout(() => s.emit('message', 'message from server'), 1000*t);
});
http.listen(3002, () => console.error('listening on http://localhost:3002/'));
console.error('socket.io example');

请参阅https://github.com/rsp/node-websocket-vs-socket.io/blob/master/si.js

正如您在此处所见,我正在创建快速应用程序:

var app = require('express')();

然后我使用该应用程序创建一个http服务器:

var http = require('http').Server(app);

最后我使用那个http服务器来创建Socket.io实例:

var io = require('socket.io')(http);

跑完后:

http.listen(3002, () => console.error('listening on http://localhost:3002/'));

一切都在一起工作。

您可以在GitHub上看到整个示例,其中后端和前端代码都可以使用。它目前使用Express 4.14.0和socket.io 1.4.8。

答案 1 :(得分:0)

对于仍然想使用 socket.io 和表达 http 请求的任何人。最简单的方法是创建两个单独的 http 服务器实例,列出不同的端口。 1 个用于 websockets,第 2 个用于 api 请求。

const express = require("express");
const app = express();
const httpServer = require("http").createServer(app);
const io = require("socket.io")(httpServer, {
    path: '/'
});

// routes and io on connection

httpServer.listen(5000, () => {
   console.log("Websocket started at port ", 5000)
});

app.listen(3000, () =>{
   console.log("Http server listening at", 3000)
})