异步等待未按预期工作。使用await

时间:2019-04-09 19:34:12

标签: javascript node.js async-await

我正在使用带有节点js的socket.io。对于身份验证,我在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 个答案:

答案 0 :(得分:1)

您在authenticateUser中创建的承诺对调用者不可见,因为它是在您传递给io.use()的函数范围内创建的。

相反,请尝试在更高的词汇水平上创建promise,以便在您完成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
            }
        });
    });
}