这不仅仅是一个建筑问题。我正在开发一个使用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和调用模型。他们如何在多个实例中保持连接?
答案 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”时,我不知道你是不是想做什么,但我希望它对你有用。