首页 > 解决方案 > 无法将变量名称从一个节点模块发送到另一个节点模块以将其用作使用 socket.io 的聊天应用程序的房间名称

问题描述

我能够从用户那里获取房间名称,但是当我module.exports在另一个文件中使用它来检索它时显示 undefined 。这可能是因为它是异步的。

//roomcheck.js

var nsp = io.of("/gameroom");
nsp.on('connection', (socket) => {
socket.on('check', (data) => {
    if (rm.includes(data)) {
        roomname = data;
        console.log(roomname);
        console.log("Room exist!!!");
        socket.emit('success', 'room already made');
});

module.exports=roomname;

//userpage.js

var r=require('roomcheck.js');
console.log(r.roomname);

预期- 用户输入的房间名称。

我的输出- 未定义

标签: javascriptnode.jswebsocket.iobackend

解决方案


  • 首先,你是对的,因为它是异步的
  • 其次,您已将 module.exports 本身设置为房间名,这意味着 module.exports 不是对象,而是字符串本身

所以基本上 r 是 module.exports

如果我是你,我会制作具有 onRoomCheck 函数的 module.exports 和对象,我可以将回调传递给

示例代码:

//roomcheck.js

var roomCheckCallback = ()=>{};
var nsp = io.of("/gameroom");
nsp.on('connection', (socket) => {
socket.on('check', (data) => {
    if (rm.includes(data)) {
        roomname = data;
        console.log(roomname);
        roomCheckCallback({roomname:roomname,exists:true});
        console.log("Room exist!!!");
        socket.emit('success', 'room already made');
    } else { roomCheckCallback({roomname:null,exists:false}); }
});
module.exports = {}
module.exports.onRoomCheck = function(callback){
    roomCheckCallBack = callback;
}

//userpage.js

var r=require('roomcheck.js');
r.onRoomCheck( (room)=> { console.log(room.roomname) } );

推荐阅读