#javascript #node.js #sqlite
#javascript #node.js #sqlite
Вопрос:
Я вызываю функцию, чтобы узнать, есть ли адрес электронной почты в базе данных. Это либо пустой, либо заполненный массив. Всякий раз, когда я возвращаю это значение, оно впоследствии не определено. Как я могу это решить? Заранее спасибо!
Я пробовал использовать next() и promises.
Функция, которая вызывает функцию запроса к БД.
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) выдает undefined.
В то время как console.log(rows) выдает массив с результатами.
Ответ №1:
Помещение await
перед несинхронной функцией волшебным образом не заставляет функцию ждать разрешения вызовов db. Вам нужно обернуть вызовы db в обещание, например:
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, вместо этого повторно используйте соединение…