使用 passport.js、bcrypt 和 sqlite3 时获得 Promise { <pending> }

Getting Promise { <pending> } while using passport.js, bcrypt and sqlite3

这是我的 app.js

中的相关代码
async function getusername(username) {

  const pro1 =await  new Promise((resolve, reject) => {
    sqlDB.all(sql, [username], (err, rows) => {
      if (err) {
        // promise needs to be rejected as an error occurred
        reject(err)
      }
      if (!(rows.length === 0) && username === rows[0].username) {
        console.log(username + " sqn " + rows[0].username);
        // console.log(rows[0]);
        currentUsernameObj = rows[0];
      } else {
        console.log("user not found");
      }
      resolve(currentUsernameObj);
    });
  });
  return pro1;
}
async function getid(id) {
  const pro2 = await new Promise((resolve, reject) => {
    sqlDB.all(sql2, [id], (err, rows) => {
      if (err) {
        reject(err);
      }
      if (!(rows.length === 0) && id === rows[0].id) {
        console.log(id + " sqn " + rows[0].id);
        console.log(rows[0]);
        currentIdObj = rows[0];

      } else {
        console.log("userid not found")
      }
      resolve(currentIdObj);
    })
  });
  return pro2;
};
// in order to be able to call an async method with await the call has to be in an async method itself
(async () => {

  
  initializePassport(
    passport,
    async function (username) {
      let x = await getusername(username)
      return await x;
    },
    async function (id) {
      let y = await getid(id)
      return y;
    }
  )

})();

app.post('/login', passport.authenticate("local", {
  successRedirect: '/secrets',
  failureRedirect: '/login',
  failureFlash: true

}));

这是我的护照配置文件中的代码

 const LocalStrategy = require('passport-local').Strategy
 const bcrypt = require('bcrypt');


function  initializePassport(passport,getUserByUsername,getUserById){ 

    async function authenticateUser(username,password,done){
        const user = getUserByUsername(username)
        if(user==null){
            return done(null,false,{ message: 'No user with that username' })
        }
        else{
            console.log(password + " user.pass : "+ user.password);
            console.log(user);

        }
        try {
            if(
                
                await bcrypt.compare(password, user.password)){
                return done(null, user)
            }
            else{
                return done(null, false, { message: 'Password incorrect' })
            }
        } catch (e) {
            return done(e)
            
        }

    }
    passport.use(new LocalStrategy({ usernameField: 'username' }, authenticateUser))
    passport.serializeUser(function(user, done) {
        done(null, user.id);
      });
      
    passport.deserializeUser(function(id, done) {
        return done(null, getUserById(id));
      });
}
module.exports= initializePassport

这是我的输出

错误出现在进入 passport-config 的 initializePassport 中,然后当 bcrypt 尝试比较密码时我们收到错误,因为用户是待定 promise.I 相信我已经做出承诺并正确等待但我得到一个未决的承诺(如控制台日志中所示),我认为这是因为在从数据库中获取数据之前调用了 initializePassport。我不知道如何让它等待。我尝试在调用 getusername() 之后放置一个 .then,但这似乎也没有用

getUserByUsername 是一个总是 returns 承诺的函数,因此用户是承诺对象是正常的。您没有从承诺中获得已解决的价值。执行 const user = await getUserByUsername(username) – trincot