在expresspath文件中使用socket.io

我试图用Node.js使用Socket.io,并发送到一个路由的逻辑内的套接字。

我有一个相当标准的Express 3安装程序,其中包含一个位于path中的server.js文件,然后我有一个index.js,位于path文件夹中,用于导出网站的所有页面/公共访问function。 所以他们看起来像:

exports.index = function (req, res) { res.render('index', { title: "Awesome page" }); }; 

在server.js中定义的路由如下所示:

 app.get('/',routes.index); 

我假设我必须在server.js中创buildsocket.io对象,因为它需要服务器对象,但是如何访问该对象并从index.js导出函数发出它?

您可以将路由文件设置为一个函数,并在需要文件时传递Socket.IO对象。

 module.exports = function(io) { var routes = {}; routes.index = function (req, res) { io.sockets.emit('payload'); res.render('index', { title: "Awesome page" }); }; return routes; }; 

然后需要这样的路线:

 var express = require('express'); var app = express(); var http = require('http'); var server = http.createServer(app); var io = require('socket.io').listen(server); var routes = require('./routes')(io); 

现在有一个更好的方法来使用Express 4.0,使用app.set()来存储对io对象的引用。

基本configuration:

 var app = require('express')(); var server = app.listen(process.env.PORT || 3000); var io = require('socket.io')(server); // next line is the money app.set('socketio', io); 

内部路由或中间件:

 exports.foo = function(req,res){ // now use socket.io in your routes file var io = req.app.get('socketio'); io.emit('hi!'); } 

阿罗西斯的回答很好,但是我遇到了和维克托一样的问题,用这种方法pipe理客户端连接。 对于客户端上的每一次重新加载,你都会在服务器上得到尽可能多的重复消息(第二次重载= 2重复,第三次= 3次重复等)。

在aarosil的答案上​​展开,我使用这种方法在我的路由文件中使用套接字对象,并pipe理连接/控制重复消息:

内部服务器文件

 // same as aarosil (LIFESAVER) const app = require('express')(); const server = app.listen(process.env.PORT || 3000); const io = require('socket.io')(server); // next line is the money app.set('socketio', io); 

里面的路线文件

 exports.foo = (req,res) => { let socket_id = []; const io = req.app.get('socketio'); io.on('connection', socket => { socket_id.push(socket.id); if (socket_id[0] === socket.id) { // remove the connection listener for any subsequent // connections with the same ID io.removeAllListeners('connection'); } socket.on('hello message', msg => { console.log('just got: ', msg); socket.emit('chat message', 'hi from server'); }) }); } 

刚使用什么错误

 global.io = require('socket.io').listen(server); 

如果您在父模块中导出服务器, module.parent.exports.server也可以工作。