在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
也可以工作。