Клиент ввода-вывода сокета не выдает при использовании вне начального соединения

#node.js #vue.js #socket.io

#node.js #vue.js #socket.io

Вопрос:

У меня есть приложение Vue, которое устанавливает соединение с сокетом при входе пользователя в систему. У моего компонента есть метод, который обращается к внешнему переменному сокету, который я создал, чтобы я мог генерировать события другими методами..

 onLoginSuccess() {
     socket = io(`${process.env.SERVER_URL}`);
     socket.emit('login', localStorage.getItem('username'));
     socket.on('login-response', (response) => {
       if (!response.status) {
         alert(response.message);
         return false;
       } else {
         this.$router.push("/home");
         this.$refs.form.reset();
       }
     });
}

  

Однако, когда я пытаюсь выполнить socket.emit в другом случае, это не работает:

     onSocketLogout() {
      console.log('socket logout call', socket)
      socket.emit('delete_username_from_array', localStorage.getItem('username') );
    },
  

Сокет, похоже, не имеет значения null / undefined на консоли, и я попытался поместить тот же источник событий в функцию onLoginSuccess, и она работает нормально. Он просто не работает, когда я использую сокет в других функциях или местах вне начального соединения.

Вот мой код сервера ввода-вывода сокета:

 let logged_in_users = [];
const io = require('socket.io')(http);

io.on('connection', function(socket){
  console.log(`Socket ${socket.id} connected`);

  socket.on('login', function(username){
    // check duplicates
    if(logged_in_users.includes(username)){
      socket.emit('login-response', {
        message: 'It seems that you have already logged in on another browser. Please logout first.',
        status: false
      });
      return false;
    }else{
      socket.emit('login-response', {status: true});
      console.log(`${username} logged in`)
      logged_in_users.push({ username, id: socket.id });
    }
  });

  // for logout
  socket.on('delete_username_from_array', function(username){
    console.log('removing username from array')
    // delete the username from the array of logged in users
    logged_in_users.splice( logged_in_users.indexOf(username), 1 );
  });

  socket.on('test', () => {
    console.log("TEST")
  })

  socket.on('disconnect', () => {
    console.log(`Socket ${socket.id} disconnected`);
    console.log(logged_in_users)
  })

});