使用 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
这是我的 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