В операциях 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
, поэтому вы получаете эту ошибку.
В вашем случае вы должны поставить а.е. проверить в функцию обратного вызова:
authme(req.body.name,req.body.pass, function(err,data) {
if(err) {
return 'error';
}
if(au) {
req.session.username = au.name;
}
res.end('done');
});
Возможные дублируют http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an- асинхронный вызов – tforgione