我有以下代码,不能正确返回数据。
app.post('/login',function(req,res){
sess=req.session;
var au = authme(req.body.name,req.body.pass, function(err,data) {
if(err) {
return 'error';
}
console.log(data);
return data;
});
if(au) {
sess.username = au.name;
}
res.end('done');
});
数据一直传递到console.log(数据);但是当我尝试在au语句中使用时,它返回undefined。
答案 0 :(得分:1)
这是经典的异步问题。 authme
以异步方式运行,因此代码不会从上到下运行。
var au = authme(req.body.name,req.body.pass, function(err,data) {
console.log('I am second!')
});
console.log('I am first!')
您需要稍微重新构建代码才能获得所需的行为。
app.post('/login',function (req,res) {
authme(req.body.name,req.body.pass, function(err, data) {
if (err) {
return 'error';
}
if (data) {
req.session.username = data.name;
}
res.end('done');
});
});
答案 1 :(得分:1)
对authme
的函数调用可能是异步的。将if
语句放在函数调用的回调中,以确保在异步函数完成执行后始终验证它。
app.post('/login',function(req,res){
sess=req.session;
(authme(req.body.name,req.body.pass, function(err,data) {
if(err) {
return 'error';
}
console.log(data);
if(data) {
sess.username = au.name;
}
}))();
res.end('done');
});
答案 2 :(得分:1)
在Nodejs中,操作是异步的 - 简而言之,它意味着结果稍后得到解决,当代码执行继续时,您不确切知道何时,而不是等待它。处理此类调用的方法是回调。有关该主题的更多信息here和here。
因此,使用您的代码,您将陷入经典陷阱。这部分代码
var au = authme(req.body.name,req.body.pass, function(err,data) {
if(err) {
return 'error';
}
console.log(data);
return data;
});
是异步调用,表示此部分
function(err,data) {
if(err) {
return 'error';
}
console.log(data);
return data;
}
是回调,只有在获得结果时才会运行。虽然这部分
if(au) {
sess.username = au.name;
}
var au = authme(req.body.name,req.body.pass)
完成后,立即执行 。
到那时,没有au
被解决,所以这就是你得到这个错误的原因。
在你的情况下,你应该把au check放入回调中:
authme(req.body.name,req.body.pass, function(err,data) {
if(err) {
return 'error';
}
if(au) {
req.session.username = au.name;
}
res.end('done');
});