为什么db.all中的rows(callback)函数在定义行时返回undefined?

时间:2019-04-05 19:10:21

标签: javascript node.js sqlite

我正在调用一个函数来查看数据库中是否有电子邮件地址。它是一个空数组或填充数组。每当我返回此值后,它都是不确定的。我该如何解决?预先感谢!

我尝试使用next()和promises。

调用db查询函数的函数。

    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)给出未定义。 当console.log(rows)给出一个带有结果的数组。

1 个答案:

答案 0 :(得分:0)

await放在非异步函数前面并不能使该函数神奇地等待数据库调用解决。您需要将db-calls包装在一个promise中,例如:

 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时连接到数据库,而应重新使用连接...