Невозможно отправить имя переменной из одного модуля узла в другой, чтобы использовать его в качестве имени комнаты для приложения чата, использующего socket.io - PullRequest
0 голосов
/ 25 июня 2019

Я могу получить имя комнаты от пользователя, но, поскольку я использую module.exports в другом файле, для его получения отображается неопределенное.Это может быть потому, что это асинхронный.

// 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);

Ожидается - имя комнаты введено пользователем.

Мой вывод - не определено

Ответы [ 2 ]

1 голос
/ 25 июня 2019
  • Во-первых, вы правы, потому что это асинхронно
  • Во-вторых, вы сами установили module.exports в качестве имени комнаты, что означает, что module.exports не является объектом, это сама строка

Так что в основном r это module.exports

На вашем месте я бы создал module.exports и объект с функцией onRoomCheck, в который я мог бы передать обратный вызов

Пример кода:

// 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) } );
0 голосов
/ 12 июля 2019

Решением этой проблемы является задержка с помощью функции setTimeout. In roomcheck.js

setTimeout(()=>{
module.exports=roomname;
},1000);

Это обеспечивает задержку в 1 секунду и дает roomcheck.js, чтобы получить имя комнаты и затем экспортировать его

...