2015-11-02 91 views
0

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

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(data);但是当我尝试在au语句中使用时,它的返回值未定义。

+2

可能重复http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-异步调用 – tforgione

回答

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

可能对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'); 
}); 
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解决,所以这就是为什么你得到这个错误。

在你的情况,你应该把非盟签入回调:

authme(req.body.name,req.body.pass, function(err,data) { 
      if(err) { 
        return 'error'; 
      } 
      if(au) { 
       req.session.username = au.name;   
     } 
      res.end('done'); 
    });