Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么db.all的rows(回调)函数在定义行时返回undefined?_Javascript_Node.js_Sqlite - Fatal编程技术网

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

Javascript 为什么db.all的rows(回调)函数在定义行时返回undefined?,javascript,node.js,sqlite,Javascript,Node.js,Sqlite,我正在调用一个函数,查看数据库中是否有电子邮件地址。它要么是空数组,要么是填充数组。无论何时我返回这个值,它都是未定义的。我怎样才能解决这个问题?提前谢谢 我试过使用next()和promises 调用db查询函数的函数 const emailExists = async function(req,res,next){ let emailInDb = await usermodel.getOneByEmail(req, next); console.log

我正在调用一个函数,查看数据库中是否有电子邮件地址。它要么是空数组,要么是填充数组。无论何时我返回这个值,它都是未定义的。我怎样才能解决这个问题?提前谢谢

我试过使用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;
         });
     };
log(emailInDb)提供未定义的。
而console.log(行)给出了一个带有结果的数组。

wait
放在非异步函数前面不会神奇地使函数等待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时都连接到数据库,而应该重用连接