javascript - 如何从路由文件中在 socket.io 中发出事件?

标签 javascript node.js express socket.io

这是我的应用配置

应用程序.js

//SERVER
var server = app.listen(3000, function(){
    console.log("Express server listening on port %d in %s mode", app.get('port'),
    app.settings.env);
});
//SOCKET.IO
var io = require('./socket.io').listen(server)

/套接字

var socketio = require('socket.io')

module.exports.listen = function(app)
{
    io = socketio.listen(app);
    io.configure('development',function()
    {
            //io.set('transports', ['websocket', 'xhr-polling']);
            //io.enable('log');
    });
    io.configure('production',function()
    {
        io.enable('browser client minification');  // send minified client
        io.enable('browser client etag');          // apply etag caching logic based on version number
        io.set('log level', 1);                    // reduce logging
        io.set('transports', [                     // enable all transports (optional if you want flashsocket)
            'websocket'
          , 'flashsocket'
          , 'htmlfile'
          , 'xhr-polling'
          , 'jsonp-polling'
        ]);
    });
    io.sockets.on('connection', function (socket)
    {
        console.log("new connection: "+socket.id);
        socket.on('disconnect',function(){console.log("device "+socket.id+" disconnected");});

        socket.emit('news', { hello: 'world' });
        socket.on('reloadAccounts',function(data)
        {
            var accounts=['account1','account2']
            socket.emit('news',accounts)
        });
    });
    return io
}

/路线

    exports.newAccount=function(fields,callback)//localhost:3000/newAccountForm
    {
//... bla bla bla config db connection bla bla bla
            db.collection('accounts').insert(fields,function(err,result)
            {
                if(err)
                {
                    console.warn(err);
                    db.close();
                    return callback(err,null);
                }else{
                    if(result)
                    {
                        db.close();
                        return callback(null,result);
                                socket.emit('new account created',result) // i want to emit a new event when any user create an account

                    }else{
                        db.close();
                        return callback('no se consigue resultado',null);
                    }
                }
            })
        });
    }

如何从路由文件在 socket.io 中发出事件?

最佳答案

首先,您需要确定要发送新信息的套接字。如果是所有这些(对于连接到您的应用程序的每个人),那将很容易,只需使用 io.sockets.emit:

./socket.io 文件中添加 exports.sockets = io.sockets;io = socketio.listen(app);。然后在路由文件中,你可以像这样发出:

var socketio = require('./socket.io');
socketio.sockets.emit('new account created', result);

如果您知道要发送到的套接字 ID,那么您可以这样做:

var socketio = require('./socket.io');
socketio.sockets.sockets[socketId].emit('new account created', result);

你也可以通过 express session id 选择套接字:

首先,您需要在授权时将 session ID 附加到套接字:

io.set('authorization', function (data, accept) {
    // check if there's a cookie header
    if (data.headers.cookie) {
        // if there is, parse the cookie
        data.cookie = cookie.parse(data.headers.cookie);
        // note that you will need to use the same key to grad the
        // session id, as you specified in the Express setup.
        data.sessionID = data.cookie['express.sid'];
    } else {
       // if there isn't, turn down the connection with a message
       // and leave the function.
       return accept('No cookie transmitted.', false);
    }
    // accept the incoming connection
    accept(null, true);
});

然后您可以选择具有 session ID 的套接字:

var socketio = require('./socket.io');
var sockets = socketio.sockets.forEach(function (socket) {
    if (socket.handshake.sessionID === req.sesssionID)
        socket.emit('new account created', result);
});

您还可以查询您的 session 存储并使用我上面描述的方法,将事件发送到具有与您的查询匹配的 sessionId 的套接字。

关于javascript - 如何从路由文件中在 socket.io 中发出事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17894426/

相关文章:

node.js - Apollo Server 上下文函数每 2 秒执行一次

node.js - 使用 Mocha 测试 Express 和 Mongoose

javascript - 调试器中的 console.log 行号

javascript - 在 JavaScript 中引用复杂变量

node.js - 是否可以在没有 IIS 的情况下使用 Windows 集成身份验证?

node.js - "npm update"正在安装模块的 beta 版本,而不是在 "npm install"之后安装的稳定版本

mysql - 如何将日志javascript保存到数据库

javascript - requireJS 整个文件夹

javascript - Angularjs 更改语言 ui-grid 选项

javascript - 下载 npm dist 包,无需安装 npm