gpt4 book ai didi

javascript - 异步等待未按预期工作。使用 await 后值为 'undefined'

转载 作者:行者123 更新时间:2023-11-29 23:01:05 24 4
gpt4 key购买 nike

我将 socket.io 与 Node js 一起使用。对于身份验证,我在 socket.io 中使用了中间件,但代码并未等待中间件完成其工作,因此值为“未定义”。

这里是主函数。

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;
}
}

谢谢!

最佳答案

您在 authenticateUser 中创建的 promise 对调用者不可见,因为它是在您传递给 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
}
});
});
}

关于javascript - 异步等待未按预期工作。使用 await 后值为 'undefined',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55600052/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com