我正在使用带有节点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;
}
}
谢谢!
答案 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
}
});
});
}