我正在使用
passport
来处理用户身份验证。在初始化期间,我必须执行以下操作来管理会话 cookie:
passport.serializeUser((user, done) => done(null, user.ID));
passport.deserializeUser((id, done) => done(null, getUserById(id)));
这里,我已将用户存储在数据库中,因此
getUserById
是一个异步函数,定义如下:
const getUserById = async (id) => {
result = await executeQuery(`SELECT ID, USERNAME, PASSWORD FROM STUDENTS WHERE ID=:id`, [id]);
if (result.rows.length != 0) return result.rows[0];
else return null;
};
这里,
getUserById(id)
函数不会立即返回查询执行的结果,而是返回一个promise
。将这个 getUserById()
函数传递给 done()
的正确方法是什么?
getUserById(id)
包装在另一个 IIFE 异步函数中吗?passport.deserializeUser(async (id, done) => {
const user = await getUserById(id);
done(null, user);
});
我想到的第一个解决方案:
passport.deserializeUser((id, done) => {
getUserById(id).then(user => done(null, user))
};
即,使用
then()
处理承诺。不知道deserializeUser
是否会采取异步回调函数。我确实知道一些函数,比如 React 中的 useEffect
不知道。
是的,您可以传递异步函数并在 try-catch 块中使用await。你可以做这样的事情:
passport.deserializeUser(async (id, done) => {
try {
const user = await getUserById(id);
return done(null, user);
} catch (error) {
return done(error);
}
});