2012-07-04 45 views
0

我是一個很長時間的PHP開發人員,他決定今天給node.js一個試試。我正試圖找到將我的結果合併到單個對象中的最佳方法。我可能正在接近這一點,就像一個PHP開發人員,可以使用一些幫助。提前致謝。node.js - 如何擴展mysql結果對象

app.get('/api/posts', function(req, res) { 
    url_parts = url.parse(req.url, true) 
    query = url_parts.query 
    current_page = query.page || 1 
    items_per_page = 50 
    start_index = (current_page - 1) * items_per_page 
    max_page = 1000 

    var getPosts = { 
     db: function() { 
      var posts = {} 
      connection.query('SELECT COUNT(*) AS count FROM rss', function(err, rows1, fields) { 
       if (!err) 
       { 
        total_pages = Math.ceil(rows1[0].count/items_per_page) 

        if (start_index < rows1[0].count || start_index < max_page) 
        { 
         sql = 'SELECT id, title, image, width, height, url FROM rss ORDER BY date DESC LIMIT '+start_index+', '+items_per_page 
         connection.query(sql, function(err, rows2) { 
          if (!err) 
          { 
           for (var i in rows2) 
           { 
            comments = 'SELECT comment FROM comments WHERE section_id = '+rows2[i].id+' ORDER BY date DESC' 
            connection.query(comments, function(err2, rows3) { 
             //COMBINE RESULTS HERE 
             //rows2[i].comments = rows3 
            }); 
           } 

           //res.json(rows2) 
           // DISPLAY RESULTS HERE 
          } 
          else 
          { 
           console.log(err) 
          } 
         }); 
        } 
       } 
       else 
       { 
        console.log(err) 
       } 
      }); 
     } 
    } 

    getPosts.db(); 
}); 

回答

1

不管你做什麼,都不要使用Node創建循環。這隻會創建一個阻塞呼叫。你需要使用回調。您可以手動執行這些操作或使用可幫助的庫。我喜歡異步(https://github.com/caolan/async),所以這裏是循環代碼替換爲異步。

async.forEachSeries(rows1, function(row, callback) { 

     sql = 'SELECT id, title, image, width, height, url FROM rss ORDER BY date DESC LIMIT '+start_index+', '+ items_per_page 
     connection.query(sql, function(err, rows2) { 
      if (!err) { 
       async.forEachSeries(rows2, function(row2, callback2) { 
         // do whatever processing you will do here. 
         // now call the callback2 to signal you have finished processing. 
         callback2(); 
       },function(err) { 
         // handle any errors that might occur in your 'loop' here. 
       }); 
      } 
    callback() 
},function(err) { 


}); 

你的代碼的另一個建議是,你不應該手動構建你的SQL。使用 ? PARAMS。例如:

connection.query("SELECT id, title, image, width, height, url FROM rss ORDER BY date DESC LIMIT ?,?", [start_index, items_per_page], function(err, rows, fields) { 
...do your processing 
} 

希望這會有所幫助。

+0

循環上的建議是不好的。當你需要時使用循環。只要確保你不會迭代循環中的數百萬項目或執行復雜的操作。如果您需要這樣做,請考慮使用隊列/消息系統,您可以在其他工作進程中執行該工作。 –

1

AlexGrad對於使用異步模塊是正確的,它會幫助你更好地組織你的代碼(也可以幫助阻止事件循環,但在這裏不太可能)。你也應該按照他的建議使用?角色逃跑。

對於您的實際問題,將結果添加爲ad-hoc屬性是很好的。