2015-04-12 39 views
0

我有一个node.js的JS sqlite3的控制器功能:为什么JS函数的控制sqlite3数据库的执行顺序不是一步一步的?

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)。那么为什么它是这样的,我怎样才能从数据库中获得价值?

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

+4

因为它是异步的? – zerkms

+0

是的,从sqlite文件,它是异步的,所以我怎么能得到的价值....我在寻找答案 – Hope

+0

他们在回调函数。你已经把它们放入'rows'变量中。 – zerkms

回答

-1

节点不会等待数据库调用完成以继续执行代码,因此您必须强制它执行此操作。您发布的代码在定义之前返回变量'temp',然后在数据库调用完成后,回调(您的'保存'功能)为其分配值。试试这个:

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

我没有设置你的环境,所以我无法测试的代码,但希望其基本思路是清晰的。

+0

我试过这个,但'返回'是为函数'save',而不是主函数'findUser',所以结果仍然是一样的...... – Hope

+0

如果给自己一个回调,你应该可以解决这个问题。我编辑了我的答案来演示如何这样做。 – remyp

+0

这就是答案!这有效,回调是一个非常聪明的方法在异步环境中,我也发现了另一种[方式](http://stackoverflow.com/questions/17954743/node-js-and-express-passing-sqlite-data-to-one -of-my-views),但我没有尝试它,似乎打破了数据库控制器的清晰结构。非常感谢你! – Hope

相关问题