NodeJS、Express 和多事的 Socket.io

Posted

技术标签:

【中文标题】NodeJS、Express 和多事的 Socket.io【英文标题】:NodeJS, Express, and eventful Socket.io 【发布时间】:2014-10-12 19:12:04 【问题描述】:

我想构建一个 NodeJS API,以便当我到达端点时,应用程序将触发一个事件,该事件将导致其唯一的套接字连接到 emit 向其侦听器发送一条消息。在使用 Python/Django、Redis 和 NodeJS/Socket.io 之前,我已经构建了一个解决方案,其中 Django 作为 API,Redis 作为“事件触发器”,但我想将不同的技术整合到 NodeJS 和 Socket.io 中。

我尝试将 socket.emit() 代码移动到不同的模块中,然后 app.use()'d 那些模块,但代码由于没有套接字实例而损坏。

我也知道你可以广播到端点上的所有套接字连接,例如:

app.use('socket.io/help', function(req, res) 
    console.log(req.query);
    io.sockets.emit('help_message', 'You should help me.');

    res.send('help msg sent');
);

但我正在寻找一种方法,允许客户端(没有套接字连接)访问端点并传递一个查询参数,告诉 NodeJS 将消息发送到其连接的哪个套接字。

这可能吗?还是我想与框架抗争?例如,对于不同的 JS WebSocket 框架/技术,是否有不同的方法?

【问题讨论】:

你在你的控制器/模块文件中使用socket而不是app.js吗? 【参考方案1】:

我一直被困在同样的情况下,但很容易解决

你已经在 app.js 上创建了套接字

server = require('http').createServer(app),
io = require('socket.io').listen(server);
server.listen(port);
global.socketIO = io;

现在您可以将此 io 实例调用到您的任何控制器,例如

app.use('socket.io/help', function(req, res) 
console.log(req.query);
 var io = global.socketIO;
 // UID IS THE VARIABLE
 io.sockets.emit('help_message'+UID, 'You should help me.');
 res.send('help msg sent');
);

客户端

<script src="/socket.io/socket.io.js"></script>
 <script>
window.socket.on("help_message_<%-UID%>", function(msg) 
//// ACTION
 );

【讨论】:

我可以看到 global 对象如何帮助保留 io 实例,但此解决方案仍会发送到所有连接的套接字,而不仅仅是具有 uid 的套接字......对吗? 您可以在 emit 和 ON 上放置变量而不是字符串,就像我在上面编辑的那样【参考方案2】:

您可以加入一个带有您想要接收消息的特定套接字的房间。

见Rooms & Namespaces in the socket.io documentation

在您的帮助台上加入一个频道:

io.on('connection', function(socket)
  socket.join('helpdesk');
);

并向他们广播:

app.use('socket.io/help', function(req, res) 
    console.log(req.query);
     var io = global.socketIO;
     io.sockets.emit('adduser', req.body.uid);
     io.to('helpdesk').emit('some event'):
     res.send('help msg sent');
);

【讨论】:

以上是关于NodeJS、Express 和多事的 Socket.io的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS / Express:从请求中获取用户名和密码

重点突破—— Nodejs+Express+MongoDB的使用基础

window下nodejs环境和express插件的安装

发送带有 axios 和强大的图像( nodejs -> express )

Express 和 Nodejs:调用外部 API 的最佳方式

求助:关于nodejs使用express,报错:模块缺失