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+MongoDB的使用基础
发送带有 axios 和强大的图像( nodejs -> express )