【问题标题】:NodeJS, socketIO, multiple filesNodeJS,socketIO,多个文件
【发布时间】:2016-08-09 04:16:04
【问题描述】:

我有点困惑;

我想在 NodeJS 应用程序上使用 socketIO。 我创建了这个(伪)代码:

//server.js
var app = express();
//some code...
var router = require('./app/router');
app.use(router);

var server = app.listen(appConfig.app.port, function () {
    var port = server.address().port;
});
var io = require('socket.io')(server);
io.on('connection', function (client) {
    console.log('Client connected...');

    client.on('join', function (data) {
        console.log(data);
    });
});


//client.js
var socket = io.connect('http://localhost:5555');
socket.on('connect', function(data) {
    socket.emit('join', 'Hello World from client');
});

一切都很好。但是!

现在,我想在另一个文件中发出事件。 我有路由器和 POST 请求。我想在 POST 请求上发出事件(请求处理程序在另一个文件中)。

//router.js
router.route("/addmenu").post(function (req, res) {
        menuModel.addMenu(req.body,function(data){
            //I WANT EMIT HERE
            res.json(data)
        });
    };
);

我必须在启动服务器之前初始化路由器,但我必须将服务器传递给 IO...如何将 IO 传递给路由器?

【问题讨论】:

  • 你想从你的路由回调中向所有连接的客户端发送事件吗?

标签: node.js socket.io


【解决方案1】:

你可以试试这个

//server.js
var app = express();
//some code...
var io;
var getIOInstance = function(){
  return io;
};
var router = require('./app/router')(getIOInstance);
app.use(router);

var server = app.listen(appConfig.app.port, function () {
    var port = server.address().port;
});

io = require('socket.io')(server);
io.on('connection', function (client) {
    console.log('Client connected...');

    client.on('join', function (data) {
        console.log(data);
    });
});

//router.js
module.exports = function(getIOInstance){
    router.route("/addmenu").post(function (req, res) {
        menuModel.addMenu(req.body,function(data){
            //I WANT EMIT HERE
            getIOInstance().sockets.emit(...)
            res.json(data)
        });
    };
    return router;
);

如果您想“通知”所有连接的客户端,此解决方案将起作用。

如果您只需要通知特定的客户端,那么我会建议您使用事件发射器模块来传达这些事件,而不是在多个文件之间共享您的套接字实例。

【讨论】:

  • 谢谢,它有效!我认为这会更容易。可能我必须重组我的项目以更容易使用 socketIO。
【解决方案2】:

在 router.js 中,您可以执行以下操作:

//router.js
module.exports = function(io) {
var router = //What you declared it to be
router.route("/addmenu").post(function (req, res) {
    menuModel.addMenu(req.body,function(data){
        //I WANT EMIT HERE
        res.json(data)
    });
};
);
return router;
}


 //server.js
 //Change this line to be like the one below
var router = require('./app/router');
//.........
//.......

//Desired way
var router = require('./app/router')(io);

【讨论】:

    【解决方案3】:

    @jahnestacado 的答案可以完成这项工作,但如果您已经有一个现有的代码库,那么您需要更改每个文件的结构,您可能需要 socket.io 对象,将其作为论据。

    那么更好的方法是:

    创建 getIO() 函数——就像 @jahnestacado 所做的那样——在其中实例化 io 对象(在 server.js 中),然后导出它。

    var io;
    exports.getIO = () => io;

    然后在任何需要的地方都需要它。但请确保仅在需要时执行该功能。通常在您的控制器功能内:

    const getIO = require('../server').getIO;
    
    exports.updateSAE = (req, res) => {
      let io = getIO();
      io.emit();
      // rest of your controller function code
    }

    请注意,我没有在控制器函数之外调用 getIO 函数。例如,以下可能行不通:

    const getIO = require('../server').getIO;
    var io = getIO();
    
    exports.updateSAE = (req, res) => {
      io.emit();
      // rest of your controller function code
    }

    只是因为调用函数时socket.io对象可能还没有初始化,因此返回undefined。

    【讨论】:

      猜你喜欢
      • 2016-05-13
      • 1970-01-01
      • 2012-07-14
      • 2015-11-30
      • 2018-04-02
      • 2016-12-25
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      相关资源
      最近更新 更多