ExpressJS如何传递具有状态的对象(例如连接)?

时间:2016-02-07 19:36:16

标签: angularjs node.js express socket.io

这不仅仅是一个建筑问题。我正在开发一个使用ExpressJS,Angular和Socket.io的项目,并且遇到了尝试持久化socket.io实例化的挑战,因此其他区域可以使用它。

让我们跳进我所拥有的:

var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);

在上面的代码中,io变量可用于创建侦听器,发送消息等。在另一个文件中,我有我的路由传递给app var:

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

在我的路由中,我处理请求,在一种情况下,当POST进来时,我想在socket.io中向连接的客户端发出一条消息。如何让io变量可以被其他区域访问?

注意:我在mongodb中使用mongoose并注意到" mongoose.connect(db.url);"在服务器文件中调用,然后在其他模块中我可以要求mongoose.js和调用模型。他们如何在多个实例中保持连接?

2 个答案:

答案 0 :(得分:2)

就像使用app变量一样,你只需传递它

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

然后在路线中,你抓住它

module.exports = function(app, io) {

    app.get('something', function(req, res, next) {

        io.emit('something else');

    });

}

答案 1 :(得分:1)

我不确定真的回答你的问题,但如果你需要在你的应用程序中使用会话,你可以通过这样的初始化来分享快速路由和socket.io之间的会话:

var session = require('express-session')({
    secret: 'mysupersessioncode',
    resave: false,
    saveUninitialized: false
});

var io = require("socket.io")(server);
io.use(function (socket, next) {
    session(socket.request, socket.request.res, next);
});

然后你就可以这样做,让你的快速会话进入你的套接字:

io.on('connect', function(socket) {
    var session = socket.request.session; // This is the actual user session using a socket
}

当你谈到“坚持使用socket.io”时,我不知道你是不是想做什么,但我希望它对你有用。