我正在调用一个函数来查看数据库中是否有电子邮件地址。它要么是空数组,要么是填充数组。每当我返回此值时,它都是未定义的。我该如何解决这个问题?提前感谢!
我试过使用 next(( 和承诺。
调用数据库查询函数的函数。
const emailExists = async function(req,res,next){
let emailInDb = await usermodel.getOneByEmail(req, next);
console.log(emailInDb);
if(emailInDb.length !==0){
res.send('email already in use!');
}
else{
return next();
}
};
数据库查询。
const getOneByEmail = function (req, next){
let db = new sqlite3.Database(dbPath, (err) => {
if (err) {
console.error(err.message);
}
console.log('Connected to books db.');
});
db.all(`SELECT * FROM users WHERE email = ?`, [req.body.email],
(err, rows) => {
console.log(rows);
return rows;
});
};
console.log(emailInDb( 给出未定义。而控制台.log(行(给出一个包含结果的数组。
将await
放在非异步函数的前面并不会神奇地使该函数等待数据库调用解析。您需要将数据库调用包装在承诺中,例如:
const getOneByEmail = (req, next) => {
return new Promise((resolve, reject) => {
let db = new sqlite3.Database(dbPath, (err) => {
if (err) {
console.error(err.message);
reject(err);
}
console.log('Connected to books db.');
});
db.all(`SELECT * FROM users WHERE email = ?`, [req.body.email],
(err, rows) => {
// TODO: check for error here and reject
console.log(rows);
resolve(rows);
});
});
};
请注意,您不应该在每次调用getOneByEmail时都连接到数据库,而应该重用连接...