2013-07-25 32 views
0

我剛開始用Node.js的一個大項目,我已經在一些回調噩夢問題絆倒的對象和變量的變化。我之前做過一些node.js開發,但只有基於教程的小東西。Node.js的如何處理回調

我有一個用戶模型和所有者模型,誰是該用戶的所有者......基本上,我在node.js中構建的部分將是REST服務,因此我需要發送包含用戶的json和它是所有者的名字。我的問題是試圖獲得所有者的名字,就像我會做的紅寶石或PHP並將其設置爲屬性..但它不起作用。

人們如何處理這種在您需要更改回調函數對象Node.js的邏輯?另外我不希望它影響性能。

我使用mysql作爲數據庫,因爲這是一個需求。因此,代碼是這樣的:

//find all 
req.models.users.find({ 
    'id' : req.query.id 
}, function(err, users) { 
    if (err) console.log(err); //do something better here 
    else { 
     var json = []; 
     users.forEach(function(user) { 
      user.getOwner(function(err, owner) { 
       user.accountOwner = owner.name; 

       json.push(user; 
      });  
     }); 

     res.type('application/json'); 
     res.send(json); 
    } 
}); 

我想給這樣的事情: [{ '身份證':user.id, 「用戶名「:user.username, '電子郵件':user.email , 「所有者」:user.owner.name」 }, {...}]

回答

0

的問題是你根本不瞭解的節點代碼的控制流它不被線上面走線。底部按時間順序排列,所以你的問題是你的res.send(json)發生在(在時間)你的user.getOwner回調執行,所以y ou發送空的json,然後在發送完json數組之後將其填入json數組中。您需要使用像async.each這樣的內容來完成您的連接,等待所有用戶的所有者被填充,然後發送響應。或者你可以通過編寫SQL連接而不是對數據庫進行N + 1查詢來實際讓數據庫加入數據。

+0

是的,我知道我做的事情錯了,我真的不知道如何Node.js的作品,,,我已經說過這是節點紅寶石背景的我的第一個大項目。我一直在尋找一個解決方案和指導這個相當簡單的工作流程。 – user2528290

+0

我認爲這個問題是你認爲的,因爲在ruby/rails中很容易,在節點中很容易。沒有關聯。有些事情在node/ruby​​中同樣容易,ruby中的一些簡單事情在節點中很難(像這樣),並且ruby中的一些困難事情在節點中很容易(例如並行執行第二組DB查詢)。 –