如何从快递路线内发射到socket.io房间

时间:2014-10-16 14:28:15

标签: node.js socket.io

我有以下代码结构:

/app.js

var user = require('./server/routes/api/user');
var io = require('socket.io').listen(server);
require('./server/sockets/base')(io);

我知道我可以通过以下方式发布事件(测试和工作)

io.to("someroom").emit("news", "news");

问题是,我希望能够从我的路径文件中发出事件,该路径文件无法访问io对象。

/routes/api/user.js

router.post('/login', function(req, res){
 // HERE I WANT TO EMIT THE EVENT BY USING io.to("someroom").emit("news", "news");
 // I TRIED req.socket.emit('news', { hello: 'world' }); without luck
}

使用此文件夹结构发出最简单的方法是什么?

3 个答案:

答案 0 :(得分:2)

您的路线需要io对象,因此您必须将其作为参数传递。

在user.js中:

module.exports = function (io) {

    // all of this router's configurations

    router.post('/login', function (req, res, next) {
        io.to('someroom').emit('news', 'news');
    });

    return router;

}

使用路线时,请提及io

app.use(..., user(io));

答案 1 :(得分:0)

只需导出套接字并在要使用它的任何文件中使用它。

<强> /socket.js

var server = require('./app.js');
var io = require('socket.io').listen(server);
module.exports = io;

<强> /app.js

module.exports = server;
var user = require('./server/routes/api/user');
var io = require('./socket.js');
require('./server/sockets/base')(io);

<强> /routes/api/user.js

var io = require('../../../socket.js');
router.post('/login', function(req, res){
    io.to("someroom").emit("news", "news");
}

答案 2 :(得分:0)

const io = require('socket.io').listen(server);
app.set('io', io);

然后在路由器中

router.get('/', (req, res) => {
  req.app.get('io').to('someroom').emit('news', 'news');
});