首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NodeJS,socketIO,多个文件

NodeJS,socketIO,多个文件
EN

Stack Overflow用户
提问于 2016-04-17 12:57:44
回答 3查看 7.4K关注 0票数 9

我有点困惑;

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

代码语言:javascript
复制
//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请求时发出事件(请求处理程序在另一个文件中)。

代码语言:javascript
复制
//router.js
router.route("/addmenu").post(function (req, res) {
        menuModel.addMenu(req.body,function(data){
            //I WANT EMIT HERE
            res.json(data)
        });
    };
);

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-17 13:12:24

你可以试试这个

代码语言:javascript
复制
//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);
    });
});
代码语言:javascript
复制
//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;
);

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

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

票数 4
EN

Stack Overflow用户

发布于 2016-04-17 13:19:07

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

代码语言:javascript
复制
//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);
票数 2
EN

Stack Overflow用户

发布于 2021-04-30 02:20:41

@jahnestacado的答案可以完成这一任务,但是如果您已经有了一个现有的代码库,那么您需要更改每个文件的结构,在其中您可能需要socket.io对象来传递它作为参数。

这样做的一个更好的方法是:

要创建getIO()函数--就像@jahnestacado一样--实例化io对象(在server.js中)并导出它。

代码语言:javascript
复制
var io;
exports.getIO = () => io;

那就在你需要它的地方要求它。但是,确保只在需要时才执行函数。通常在控制器功能中:

代码语言:javascript
复制
const getIO = require('../server').getIO;

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

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

代码语言:javascript
复制
const getIO = require('../server').getIO;
var io = getIO();

exports.updateSAE = (req, res) => {
  io.emit();
  // rest of your controller function code
}

仅仅因为在调用函数时socket.io对象可能没有初始化,从而返回未定义的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36676815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档