module.exports return 从路由器调用时未定义

module.exports return undefined when called from router

我正在构建一个用户注册和 crud 应用程序。我有一个数据库模型。

var valid;
module.exports = {
    connectDB: function(){
    }
    ,
    findUser: function(req,res) {
    }
    ,
    createUser: function(email,name,password){
        var role = 'view';
        var sql = "INSERT INTO `users`(email, name, password, role) VALUES (" +  "'"+email+"'"+","+"'"+name+"'"+","+"'"+password+"'"+","+"'"+role+"'"+")";
        db.query(sql, function(err, result){
            if(err){
                console.log(`FAILED: ${err}`)
                return false; // tried setting valid to false
            }
            else
            {
                console.log(`User Created`);
                valid = true;

            }
        });
       return valid; // this also returns undefined 
    }
}

我希望能够 return 一个 bool 取决于查询的连续性。我尝试 returning true/false。我做了一些搜索为什么会这样。首先有关于js是异步的解释。 我的问题是在导出时 return 在函数中输入值以便我可以使用它的正确方法是什么?

通过使用承诺

    createUser: function(email,name,password){
        return new Promise(function(resolve,reject){
            var role = 'view';
            var sql = "INSERT INTO `users`(name, password, role) VALUES (" +  "'"+email+"'"+","+"'"+name+"'"+","+"'"+password+"'"+","+"'"+role+"'"+")";
            db.query(sql, function(err, result){
                if(err){
                    console.log(`FAILED: ${err}`)
                    reject(err);
                }
                else
                {
                    console.log(`User Created`);
                    resolve();
                }
            });
        })
    }

我们现在可以像这样使用 createUser 了;

 db.createUser(email,name,password).then(function(){
    console.log('redirect');
    res.redirect('/');
  }).catch(function(){
    console.log('something went wrong');
    res.render('signup', { message: 'something went wrong' })
  });