我想构建一个NodeJS API,这样当我到达端点时,应用程序将触发一个事件,该事件将导致其与emit
的唯一套接字连接,并向其侦听器发送消息。在使用Python/Django、Redis和NodeJS/Socket.io之前,我已经构建了一个解决方案,Django作为API,Redis作为"事件触发器",但我想将不同的技术整合到NodeJS和Socket.io中
我尝试将socket.emit()
代码移动到不同的模块中,然后app.use()
处理这些模块,但由于没有套接字实例,代码中断了。
我还知道,您可以向端点上的所有套接字连接进行广播,例如:
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框架/技术,是否有不同的方法来实现这一点?
我一直处于同样的情况,但很容易解决
您已经在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
});
您可以加入一个带有您想要在其上接收消息的特定套接字的房间。
请参阅Rooms&socket.io文档中的命名空间
在您的服务台上加入chan功能:
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');
});