Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Socket.io:Server-side';如果它';这是一定的价值_Node.js_Reactjs_Express_Socket.io - Fatal编程技术网

Node.js Socket.io:Server-side';如果它';这是一定的价值

Node.js Socket.io:Server-side';如果它';这是一定的价值,node.js,reactjs,express,socket.io,Node.js,Reactjs,Express,Socket.io,我目前正在做一个个人项目,在socket.io上遇到了一些问题 我试图从服务器发出套接字,但是,只有当套接字值/地址从/lobble/invalid更改为/lobble/info时,才会传递套接字 哦,还有,我在这个项目中使用了一个MERN堆栈 服务器 //# Loading a lobby socket.on(`/lobby/load`, async (req, res) => { let doesExist = (game.lobbies[req.id] !== undef

我目前正在做一个个人项目,在socket.io上遇到了一些问题

我试图从服务器发出套接字,但是,只有当套接字值/地址从
/lobble/invalid
更改为
/lobble/info
时,才会传递套接字

哦,还有,我在这个项目中使用了一个MERN堆栈

服务器

//# Loading a lobby
  socket.on(`/lobby/load`, async (req, res) => {
    let doesExist = (game.lobbies[req.id] !== undefined)
    // Return user if the lobby doesn't exist
    if(doesExist === false) {
      console.log(LogError(`Error: Lobby does not exist!`))
      console.log(socket.id)
      io.to(socket.id).emit(`/lobby/invalid`, {}) // This does NOT send unless I change the value to "/lobby/info"
      return
    } else { // if the lobby does exist cont.
        io.to(socket.id).emit(`/lobby/info`, { // THIS WORKS
          settings: game.lobbies[req.id].settings,
          players: game.lobbies[req.id].players,
          chat: game.lobbies[req.id].chat,
          game: game.lobbies[req.id].game,
        })
    }
  })
客户端

componentDidMount() {
    let id = window.location.pathname
    id = id.substr(7)
    
    //# Lobby info request
    socket.emit(`/lobby/load`, { id: id, uid: cookies.get("id") })
    //# Lobby invalid await
    socket.on(`/lobby/invalid`, (data) => {
      console.error(`ERROR: Lobby doesnt' exist, RETURN`)
    })
    //# Lobby info waiter
    socket.on(`/lobby/info`, (data) => {
      this.setState(data)
      console.log(this.state)
    })
  }

同样,当我使用socket.io和单用户emit时,我使用的是回调方法,如下所示

//服务器端
socket.on(`/lobb/load`,(数据,回调)=>{
let doesExist=(typeof game.lobbies[data.id]!=“未定义”);
让有效载荷={
声明:“无效”,
};
如果(性别歧视){
payload.state=“info”;
payload.settings=game.lobbies[data.id].settings;
payload.players=game.lobbies[data.id]。玩家;
payload.chat=game.lobbies[data.id].chat;
payload.game=game.lobbies[data.id].game;
}
//通过回调将有效负载返回给用户
回调(有效载荷);
process.nextTick(()=>(payload=null));
//空负载引用,以便节点的GC可以清理内存:)
});
请注意,回调应该是最后发送的,您不能在
有效负载
数据中发送回调函数

对于客户端:

socket.emit(`/lobble/load`,{id:id,uid:cookies.get(“id”)},(有效负载)=>{
如果(payload.state==“无效”){
返回console.log(“无效的游戏id!!”);
}
此设置状态(有效载荷);
console.log(this.state);
});
最后,使用这种方法,您不需要删除组件卸载时侦听的事件。:)

这就是我使用它的主要原因,而且当您发送服务器端emit时,用户总是可以打开控制台并侦听您的数据:)(也可以防止这种情况,因为一切都是通过回调=)


关于发送回调,在socket.io的文档中,它实际上被称为
ack
,您可以在这里看到:

您可以从if语句中看到控制台吗?是的,控制台日志显示100%,只是io.emit似乎只有在我使用
/lobble/info
时才起作用。奇怪的是,所有其他套接字调用在客户端和服务器端都工作得很好。只是一个猜测:在客户端上,您在发出
/lobb/load
之前是否尝试过添加侦听器?您知道
io.emit(socket.id)
实际上是
socket.emit
?也许像这样尝试一下,我会写另一个我使用的方法。再次您好,非常感谢您的回复。无论如何,这是一种更有效、更清洁的方法。我现在就试试,然后再给你回复。目前没有使用该代码,它给了我一个错误:
未处理的PromiserEjectionWarning:TypeError:回调不是一个函数(在后端)Hee bee,你使用的版本是什么?Haii,我目前使用的版本是
^3.1.1
这也是有文档记录的v3文档,我使用的是这种方法,但你们真的能在服务器端操控一切,看看回调函数的类型是否正确吗??