Nodejs:在Express路由文件中访问socket.io实例

5
我想要能够从我的Express路由文件向连接到Socket.io服务器的客户端发送数据。
我的app.js文件看起来像这样:
var express = require('express');
var app = express();

//routes
require('./routes/test')(app);

// starting http server
var httpd = require('http').createServer(app).listen(8000, function(){
  console.log('HTTP server listening on port 8000');
});

var io = require('socket.io').listen(httpd, { log: false });
io.on('connection', function(socket){
    socket.join("test");
    socket.on('message', function(data){
       .....
    });
});
module.exports = app;

我的 test.js 文件:
module.exports = function(app){
    app.post('/test', function(req, res){
       .....
       //I would like here be able to send to all clients in room "test"
    });
};
1个回答

16

只需将您的io对象作为参数注入到路由模块中:

app.js

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


// starting http server
var httpd = require('http').createServer(app).listen(8000, function(){
  console.log('HTTP server listening on port 8000');
});

var io = require('socket.io').listen(httpd, { log: false });
io.on('connection', function(socket){
    socket.join("test");
    socket.on('message', function(data){
       .....
    });
});

//routes
require('./routes/test')(app,io);

module.exports = app;

test.js :

module.exports = function(app, io){
  app.post('/test', function(req, res){
    .....
    //I would like here be able to send to all clients in room "test"
    io.to('test').emit('some event');
  });
};

2
我从未想过它会如此简单。所有相关的帖子都在谈论模块导出和其他复杂的东西。你救了我!谢谢!! - Bobby Shark
这个很好用,只是我需要先检查 io 是否有效 'if (io) { io.to....}' - Enkode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接