2015-11-02 99 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'); 
    });