Node.js Nodejs,保持MongoStore中的套接字io连接处于活动状态
在nodejs express应用程序中,我在server.js文件中设置了套接字io连接。 做这样的事情效果很好Node.js Nodejs,保持MongoStore中的套接字io连接处于活动状态,node.js,session,socket.io,Node.js,Session,Socket.io,在nodejs express应用程序中,我在server.js文件中设置了套接字io连接。 做这样的事情效果很好 var server = require('http').createServer(app) var io = require('socket.io').listen(server); io.sockets.on('connection', function (socket) { // how can I save globally this 'socket'? });
var server = require('http').createServer(app)
var io = require('socket.io').listen(server);
io.sockets.on('connection', function (socket) {
// how can I save globally this 'socket'?
});
我想将这个“套接字”全局保存在server.js文件中,以便在项目中的任何地方都能使用它。像这样:
app.get('/on', function(req, res){
socket.on('test', function (data) {
console.log(data);
});
});
app.get('/emit', function(req, res){
socket.emit('test', "ciao");
});
我知道有一种方法可以在会话中保存“套接字”连接。我的会话设置:
app.configure(function(){
// ....
app.use(express.cookieParser(SITE_SECRET));
app.use(express.session({
secret :
,store : new MongoStore({
mongoose_connection : mongoose.connection
,db: mongoose.connections[0].db
})
,cookie: { maxAge: new Date(Date.now() + (1000*60*60*24*30*12)) }
}));
...
});
做这件事的好方法是什么
另外,在完成此保存之后,如果连接尚未打开,如何使用socket.on()和socket.emit()加载第一页?您可能听到的不是将套接字保存到会话中,而是通过会话cookie引用套接字,会话cookie在套接字授权过程中传递给服务器。在授权期间,这是传递给服务器的对象类型的示例:
{
headers: req.headers, // <Object> the headers of the request
time: (new Date) +'', // <String> date time of the connection
address: socket.address(), // <Object> remoteAddress and remotePort object
xdomain: !!headers.origin, // <Boolean> was it a cross domain request?
secure: socket.secure, // <Boolean> https connection
issued: +date, // <Number> EPOCH of when the handshake was created
url: request.url, // <String> the entrance path of the request
query: data.query // <Object> the result of url.parse().query or a empty object
}
保存会话ID后,我们可以使用典型的连接事件:
var server = require('http').createServer(app)
var io = require('socket.io').listen(server);
var clients = {};
io.sockets.on('connection', function (socket) {
// save to a global object
var session = socket.handshake.sessionID;
clients[session] = socket;
socket.on('disconnect', function() {
delete clients[session];
});
});
然后我们有一个通过cookie签名的全局引用。然后,我们可以像这样访问套接字:
app.get('/path', function(req, res) {
var socket = clients[req.sessionID];
socket.emit('Socket client accessed route.');
});
请记住,对于具有多个选项卡的客户端,您可能必须在全局逻辑中添加一些逻辑,这将导致两个套接字具有相同的授权cookie
至于您关于使用
socket.on()
和socket.emit()
的问题,在建立连接之前,您不能使用它,因为套接字本身不存在。如果要向所有连接的客户端发送消息,则只需使用全局io.sockets
对象。这将更像是io.sockets.emit()
谢谢你的回答。。。但我仍然有一些问题。代码不在io.set('authorization')内,也不在io.sockets.on('connection')内,但在终端中我没有看到错误,只有info-socket.io启动。发生了什么?因此,如果我尝试在路由中调用它,套接字没有定义……你说的“代码不在内部”是什么意思?我还做了一次编辑,因为我错误地使用了cookie解析器。ehh,我为错误的表达式感到抱歉。我的意思是,如果我在io.set('authorization',function(handshake,callback){内放一个console.log(“test”),然后重新启动服务器,就没有“test”如果我继续/path,错误是无法调用undefined的方法'emit',因为clients中没有保存任何内容。我尝试了另一次尝试,但没有结果。我阅读并遵循。但仍然有相同的响应…:(
app.get('/path', function(req, res) {
var socket = clients[req.sessionID];
socket.emit('Socket client accessed route.');
});