Node.js Socket.io命名空间和文件室:无法接收带有令牌的特定url上的事件

Node.js Socket.io命名空间和文件室:无法接收带有令牌的特定url上的事件,node.js,socket.io,namespaces,Node.js,Socket.io,Namespaces,目前,我需要编写一个nodejs服务器代码,以便为所有拥有令牌的用户提供实时位置。所以我使用socket.io和express。 目前,我只在按下按钮时发送消息,然后才开始以JSON格式发送位置 客户端发送带有消息的事件,服务器在使用与第一个客户端相同的令牌向客户端发送新消息之前检索该事件 我的问题如下:我可以从客户端发送消息,但服务器无法检索相应的事件,因此无法发送其响应。 你有什么解释吗 服务器: var-app=require('express')(); var http=require(

目前,我需要编写一个nodejs服务器代码,以便为所有拥有令牌的用户提供实时位置。所以我使用socket.io和express。 目前,我只在按下按钮时发送消息,然后才开始以JSON格式发送位置

客户端发送带有消息的事件,服务器在使用与第一个客户端相同的令牌向客户端发送新消息之前检索该事件

我的问题如下:我可以从客户端发送消息,但服务器无法检索相应的事件,因此无法发送其响应。 你有什么解释吗

服务器:

var-app=require('express')();
var http=require('http')。服务器(应用程序);
var io=require('socket.io')(http);
var端口=8080;
var-tokenArray=[];
app.get('/suivi/:token',函数(req,res){
res.sendFile(uu dirname+“/src/suiveur.html”);
});
app.get(“/createChannel/:token”),函数(req,res){
控制台日志(请求参数令牌);
var newNamespace=io.of(“/”+req.params.token);
tokenArray.push(newNamespace);
newNamespace.on('connection',函数(socket){
插座开('房间'),功能(房间){
插座连接(房间子串(1,房间长度));
});
});
newNamespace.on('afficheTest',函数(msg){
控制台日志(msg);
newNamespace.to(“/”+req.params.token).emit('afficheTest',“sallt les amis”);
});
res.send(“OK”);
});
//提供服务的动态路线
app.get(“/css/:nomFichierCss”),函数(req,res){
res.sendFile(uu dirname+“/css/”+req.params.nomfichiercs);
});
//为服务脚本提供动态路线
app.get(“/script/:nomScript”),函数(req,res){
res.sendFile(uuu dirname+“/script/”+req.params.nomScript);
});
侦听(端口,函数(){
log('侦听*:'+端口);
});
客户端脚本:

window.addEventListener(“加载”,函数(){
initMap();
$(函数(){
localStorage.debug='*';
//关于récupère le token
var room=window.location.href.substring(window.location.href.lastIndexOf(“/”),window.location.href.length);
//关于se connecte au bon沙龙
var插座=io.连接(房间);
//论树枝上的人的独立性
socket.on(“新位置显示”,(表)=>{
if(tableau!=null){
表格forEach((多段线)=>{
//关于多段线画面的原则部分
map.enties.push(多段线);
})
}
});
$('#affichons')。在(“单击”,函数()上){
警报(“点击”);
插座发射(“粘贴测试”、“礼炮bb”);
});
socket.on(“afficheTest”,函数(msg){
日志(“粘贴测试:”);
警报(msg)
});
socket.on(“连接”,函数(){
插座。发射(“房间”,房间);
});
});
});

您混合了2个socket.io概念:名称空间和文件室

名称空间是一个在客户端和服务器之间共享的概念:客户端可以决定连接到名称空间,并且只有在服务器上以前创建过名称空间时,名称空间才起作用

另一方面,rooms是一个仅存在于服务器端的概念:客户端可以执行某些操作,而服务器将套接字放置在rooms中

在典型场景中,名称空间是静态的(例如:“/admin”、“/notifications”等),并在服务器启动期间创建,而聊天室是动态的,并根据需要创建(如聊天室)

在您的情况下,它可能意味着:

  • 让客户端在默认名称空间(“/”,默认情况下已经存在的名称空间)上发出socket.io消息。消息可以是
    join
    和有效负载
    {“令牌”:}
  • 然后服务器应将插座放置在相应的房间中。房间可以命名为
    位置-${token}
    之类的名称
  • 从这一点开始,您可以使用
    io.to('locations-1234567890').emit('new_location',{foo:'bar'))向房间中的所有套接字发送消息。

  • 如何启动服务器。是指pm2还是仅指节点?如果您正在使用pm2并在某些时候接收事件,则多集群模式会出现问题。