Javascript 为什么JS功能';控制sqlite3数据库的执行顺序不是一步一步?

Javascript 为什么JS功能';控制sqlite3数据库的执行顺序不是一步一步?,javascript,node.js,express,sqlite,Javascript,Node.js,Express,Sqlite,我有一个用于node.js的sqlite3 js控制器函数: exports.findUser=function findUser(user){ var temp ; var db = new sqlite3.Database('kitchen.db'); var stmt_user_find = "SELECT * FROM user WHERE un = ?"; db.all(stmt_user_find,user,save); function save(err, rows) {

我有一个用于node.js的sqlite3 js控制器函数:

exports.findUser=function findUser(user){
var temp ;
var db = new sqlite3.Database('kitchen.db');
var stmt_user_find = "SELECT * FROM user WHERE un = ?";
db.all(stmt_user_find,user,save);
function save(err, rows) {
    if (err) throw err;
    console.log(rows);
    temp = rows;
}
db.close();
return temp;
}

以及使用Express的路由器中的另一个功能:

app.post('/login', function (req, res){
    var un=req.body.un;
    var pw=req.body.pw;

        console.log('router '+db.findUser(un));

});
控制台的结果是:

router undefined
[ { un: 'as', em: 'sss', pw: 'sss' } ]
第二个函数的目的是从sqlite数据库获取值,但控制台的结果显示,首先执行“return temp”语句,然后返回到第二个函数,然后执行findUser函数的内部函数(save)。那个么为什么会是这样,我怎样才能从数据库中获得价值呢


谢谢,我已经在这个问题上尝试了几个小时。

节点不会等待数据库调用完成以继续执行代码,因此您必须强制它这样做。您发布的代码在定义变量“temp”之前返回该变量,然后回调函数(您的“save”函数)在数据库调用完成后为其赋值。试试这个:

exports.findUser=function findUser(user){
    var temp ;
    var db = new sqlite3.Database('kitchen.db');
    var stmt_user_find = "SELECT * FROM user WHERE un = ?";

    function save(err, rows) {
        if (err) throw err;
        console.log(rows);
        temp = rows;
        db.close();
        return temp;
    }
    db.all(stmt_user_find,user,save);
}
exports.findUser=function findUser(user, callback){
    var temp ;
    var db = new sqlite3.Database('kitchen.db');
    var stmt_user_find = "SELECT * FROM user WHERE un = ?";
    var finduser = this;

    db.all(stmt_user_find,user, function(err, rows){
        if (err) throw err;
        console.log(rows);
        temp = rows;
        db.close();
        return callback(temp);
    });
}
现在,findUser函数在数据库调用完成之前不会返回,因为return语句在回调中。如果你想了解更多,这是一个很好的开始

编辑:我很抱歉,当然上面的内容不起作用。你需要给自己回电话。试试这个:

exports.findUser=function findUser(user){
    var temp ;
    var db = new sqlite3.Database('kitchen.db');
    var stmt_user_find = "SELECT * FROM user WHERE un = ?";

    function save(err, rows) {
        if (err) throw err;
        console.log(rows);
        temp = rows;
        db.close();
        return temp;
    }
    db.all(stmt_user_find,user,save);
}
exports.findUser=function findUser(user, callback){
    var temp ;
    var db = new sqlite3.Database('kitchen.db');
    var stmt_user_find = "SELECT * FROM user WHERE un = ?";
    var finduser = this;

    db.all(stmt_user_find,user, function(err, rows){
        if (err) throw err;
        console.log(rows);
        temp = rows;
        db.close();
        return callback(temp);
    });
}
在你的路线上:

app.post('/login', function (req, res){
    var un=req.body.un;
    var pw=req.body.pw;

    db.finduser(un, function(found_user) {
       console.log('router '+db.findUser(un));
    });
});

我没有设置您的环境,因此我无法测试代码,但希望基本思想是清楚的。

因为它是异步的?是的,从sqlite文档中,它是异步的,因此如何获得值……我正在寻找回调函数中的答案。您已经在
变量中得到了它们。我尝试了这个方法,但是“return”是用于函数“save”,而不是主函数“findUser”,因此结果仍然是一样的……如果您给自己一个回调,您应该能够解决这个问题。我已经编辑了我的答案来演示如何做。这就是答案!!这是可行的,回调在异步环境中是一种非常智能的方法,我还发现了另一种方法,但我没有尝试,它似乎打破了数据库控制器的清晰结构。非常感谢你!很高兴我能帮忙!如果你觉得合适,请接受这个答案。