我正在使用expressjs + socket.io(使用SessionSocket插件)+ mongoosejs进行系统。
服务器的构建如下:
var mongoose = require('mongoose'),
connect = require('connect'),
express = require('express'),
http = require('http'),
io = require('socket.io');
// hold cookieParser and sessionStore for SessionSocket
var cookieParser = express.cookieParser('your secret sauce'),
sessionStore = new connect.middleware.session.MemoryStore();
// create express server
var app = express();
// config express server
require('./config/express')(app, config, cookieParser, sessionStore);
// Express3 requires a http.Server to attach socke.io
var server = http.createServer(app);
// attach socket.io
var sio = io.listen(server);
sio.set('log level', 2);
// create SessionSocket
var SessionSockets = require('session.socket.io'),
sessionSockets = new SessionSockets(sio, sessionStore, cookieParser);
// setup SessionSocket
sessionSockets.on('connection', function(err, socket, session) {
socket.join(session.user._id);
socket.emit('message', {
title: "welcome",
msg: "welcome to selink"
});
});
// config express server route
app.get('/some-action', **SomeMongooseFunction**);
// start server
server.listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
在快速路由处理程序(“SomeMongooseFunction”,在其他文件中定义)中,在处理完用户操作(查询,修改数据库等)之后,我希望向用户或其他在线用户发送实时通知。所以我必须把“sio”对象传递给“SomeMongooseFunction”,上面的例子只有一条路线,但实际上我有几十条路线,如果我这样做会显得很难看。
或在设置SessionSocket部分,我认为可以将sio粘贴到用户的会话中。但是,我不确定这种方式是否正确。
那么,有没有其他方法可以在快递处理程序中获取sio引用? (如果我可以将sio称为全局变量,那将是很好的,但全局变得邪恶......)
感谢任何想法。
答案 0 :(得分:1)
您将会话中的user ID
存储到Socket.IO会议室管理器中。现在你以某种方式获得了目标的用户ID
并为该用户发送事件消息。
对于您的情况,您正在使用notification
实体,所以让我们这样做:
//client side - send a notification for a specific user.
var note = {
from: userID, //sender
target: id, //receiver
type: type //type of notification
}
socket.emit('notification', note);
target
字段是目标用户ID,此用户将收到通知状态。
type
这里仅用于说明您是否要处理多种类型的通知。
socket.emit('notification', note);
这部分是最重要的部分。它将发送注释JSON对象
到通知事件。此事件必须在您的服务器端Socket.IO页面上注册;
//server side - receive JSON data on notification event
socket.on('notification', function(data) {
io.sockets.in(data.target).emit('notification', data);
});
注意:我使用'io'代替'sio'。
通知事件已注册,并将捕获指向它的所有客户端消息。 data
是
我们之前发送的JSON对象,所以io.sockets.in().emit()
再一次在客户端上。我们必须抓住所有通知事件。
//client side - the final destination
socket.on('notification', function(data) {
//DO SOME JQUERY STUFF TO ALERT THIS TARGET USER FROM THE MESSAGE RECEIVED.
console.log("User: " + data.from + " sent you this notification");
});
我们可以得出的结论是:
对于任何必须为特定用户发送Socket.IO消息的情况,您都可以使用此类比。