我应该将异步函数传递给passport.deserializeUser()吗?

问题描述 投票:0回答:2

我正在使用

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);
});
serialization async-await passport.js session-cookies
2个回答
0
投票

我想到的第一个解决方案:

passport.deserializeUser((id, done) => {
    getUserById(id).then(user => done(null, user))
};

即,使用

then()
处理承诺。不知道
deserializeUser
是否会采取异步回调函数。我确实知道一些函数,比如 React 中的
useEffect
不知道。


0
投票

是的,您可以传递异步函数并在 try-catch 块中使用await。你可以做这样的事情:

passport.deserializeUser(async (id, done) => {
  try {
    const user = await getUserById(id);
    return done(null, user);
  } catch (error) {
    return done(error);
  }
});
© www.soinside.com 2019 - 2024. All rights reserved.