在快速最佳实践中使用socket.io

时间:2014-02-14 03:15:11

标签: express socket.io

我正在使用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称为全局变量,那将是很好的,但全局变得邪恶......)

感谢任何想法。

1 个答案:

答案 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事件上的正确目标。

对于任何必须为特定用户发送Socket.IO消息的情况,您都可以使用此类比。