我有一个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)。那么为什么会这样呢?如何从数据库中获取价值呢?
谢谢,我已经在这个问题上试了几个小时。
答案 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));
});
});
我没有设置您的环境,所以我无法测试代码,但希望基本的想法是明确的。