为什么JS函数的控制sqlite3数据库的执行顺序不是一步一步的?

时间:2015-04-12 23:52:06

标签: 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) {
    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数据库中获取值,但是控制台的结果显示'返回temp'首先执行语句并返回第二个函数,然后执行findUser函数的内部函数(save)。那么为什么会这样呢?如何从数据库中获取价值呢?

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

1 个答案:

答案 0 :(得分:-1)

Node不会等待数据库调用完成以继续执行代码,因此您必须强制它执行此操作。您发布的代码会返回变量' 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);
}

现在,在数据库调用完成之后,findUser函数才会返回,因为return语句在回调中。如果您想了解更多信息,this link是一个很好的起点。

编辑:我道歉,当然以上都行不通。你需要给自己一个回调。试试这个:

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));
    });
});

我没有设置您的环境,所以我无法测试代码,但希望基本的想法是明确的。