NodeJS返回数据

时间:2015-11-02 13:48:38

标签: node.js undefined

我有以下代码,不能正确返回数据。

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。

3 个答案:

答案 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中,操作是异步的 - 简而言之,它意味着结果稍后得到解决,当代码执行继续时,您不确切知道何时,而不是等待它。处理此类调用的方法是回调。有关该主题的更多信息herehere

因此,使用您的代码,您将陷入经典陷阱。这部分代码

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