首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在快速最佳实践中使用socket.io

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

Stack Overflow用户
提问于 2014-02-14 03:15:11
回答 1查看 822关注 0票数 1

我正在做一个使用高速公路+socket.io(带有SessionSocket插件)+ mongoosejs的系统。

服务器的构建方式如下:

代码语言:javascript
复制
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”,在其他文件中定义)中,经过处理后的用户操作(查询、修改DB等),我希望向用户或其他在线用户发送实时通知。所以我想我必须把"sio“对象传递到"SomeMongooseFunction”中,上面的例子只有一条路,但实际上我有几十条路,如果我这样做的话,看起来会很难看。

或者在安装SessionSocket部分,我认为可以将sio粘贴到用户的会话中。但是,我不确定这样做是否正确。

那么,在快递处理程序中是否还有其他获取sio参考的方法?(如果我能像一个全局变量一样引用sio,但全局是邪恶的.)

谢谢你的建议。

EN

回答 1

Stack Overflow用户

发布于 2014-02-14 13:02:26

您正在将user ID从会话存储到Socket.IO房间管理器中。现在您已经以某种方式获取了目标的用户ID,并为该用户发送了事件消息。

对于您的情况,您使用的是notification实体,因此让我们这样做:

代码语言:javascript
复制
//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);这一部分是最重要的部分。它将向通知事件发送note对象。此事件必须在您的服务器端Socket.IO页面上注册;

代码语言:javascript
复制
//server side - receive JSON data on notification event
socket.on('notification', function(data) {
    io.sockets.in(data.target).emit('notification', data);
});

注意:我用'io‘代替'sio’。

notification事件被注册,并将捕获指向它的所有客户端消息。data是我们以前发送的JSON对象,所以io.sockets.in().emit()

再一次对客户说。我们必须捕获所有的notification事件。

代码语言:javascript
复制
//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消息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21770174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档