Асинхронное ожидание не работает, как ожидалось.Значение 'undefined' после использования await - PullRequest
1 голос
/ 09 апреля 2019

Я использую socket.io с узлом js. Для аутентификации я использую промежуточное ПО в socket.io, но код не ждет, пока промежуточное ПО завершит свою работу, поэтому значение равно «undefined».

Вот основная функция.

module.exports = async (server) => {

  const io = require('socket.io')(server);

  io.on(CONNECTION, async function (socket) {

      var email = await authenticateUser(io);
       console.log(email); // 'undefined'
      user = new User(email);
  });
}

Функция промежуточного программного обеспечения

async function authenticateUser(io) {

    io.use(async (socket, next) => {

        const handshakeData = socket.handshake.query;
        const token = handshakeData.token;

        const Email = await Token.isValid(token);

        console.log("Auth ---> " + Email); // here it is fine

        return new Promise((res, rej) => {
            if (Email) {
                res(Email);
            } else {
                rej();
            }
        });
    });
}

Функция аутентификации

exports.isValid = async (token) => {

    try {
        const decoded = jwt.verify(token, JWT_KEY);
        console.log(decoded.email) // here it is fine
        return decoded.email;
    } catch (error) {
        return false;
    }
}

Спасибо!

1 Ответ

1 голос
/ 09 апреля 2019

Обещание, которое вы создаете внутри authenticateUser, невидимо для вызывающей стороны, поскольку оно создается внутри области функции, которую вы передаете io.use().

Вместо этого попробуйте создать обещание на один лексический уровень выше, чтобы оно было видно после того, как вы закончили с обработчиком события socket.io:

// middleware function
function authenticateUser(io) {
  return new Promise((resolve, reject) => {
    io.use(async (socket, next) => {

        const handshakeData = socket.handshake.query;
        const token = handshakeData.token;

        const Email = await Token.isValid(token);
            if (Email) {
                resolve(Email);
            } else {
                reject(); // should probably put an error here
            }
        });
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...