2013-07-26 48 views
0

一個簡單的問題,我使用nodejs進行HTTP restful API服務。現在我想HTTP服務器開始之前,查詢一些MySQL數據,代碼片段:如何在nodejs中啓動http服務器之前查詢mysql

var price = -1; 
var userId = 'some user provided value'; 
var sql = 'SELECT max(price) FROM users WHERE id = ' + connection.escape(userId); 
connection.query(sql, function(err, results) { 
    price = results.price; 
}); 

server = http.createServer(function (request, response) { 
     handler(request); //response depend on price 
}).listen(8012); 

那麼如何MySQL查詢和HTTP服務器代碼結合?

+0

我認爲你需要把SQL查詢你的處理程序。對於每個用戶來說,SQL查詢的結果會不同嗎? – Nelson

+0

@Nelson否,查詢結果像全局變量,它會導致所有請求。如果我把查詢放在處理程序中,它會每次查詢每個請求,這不是我的情況 – linbo

回答

0

您剛纔添加的服務器返回的回調內部的連接查詢,像這樣:

var price = -1; 
var userId = 'some user provided value'; 
var sql = 'SELECT max(price) FROM users WHERE id = ' + connection.escape(userId); 
connection.query(sql, function(err, results) { 
    price = results.price; 
    server = http.createServer(function (request, response) { 
    console.log(price); 
    handler(request, price, response); //response depend on price 
    }).listen(8012); 
}); 
+0

謝謝,這是一個解決方案,但會導致Mysql在http服務器工作期間保持連接嗎?如果Mysql斷開(通常在8小時後它將斷開連接),應用程序工作正常嗎? – linbo

+0

只要你不再需要數據庫,這工作得很好。所有連接用於獲取價格變量,它調用的回調實際上並不依賴於它。 如果你想刪除mysql連接,只需調用connection.close(); – cptroot

1

雖然這是一個簡單的問題的答案的大小是巨大的! Tim Ruffles在本週(2013年7月)舉辦了關於倫敦節點用戶組的主題的全部講座,該講座可作爲視頻講座[http://www.youtube.com/watch?v=nHXKA82M- LY]。

這裏的問題是如何處理需要在異步(無順序保證)編程環境中工作時需要同步完成的事情(按順序)的基本問題。

蒂姆用來處理這個問題的方式列表中有三種似乎能夠在這裏幫助你。

正如在其他職位的建議,你可以使用一個回調從代碼:

var price = -1; 
var userId = 'some user provided value'; 
var sql = 'SELECT max(price) FROM users WHERE id = ' + connection.escape(userId); 
connection.query(sql, function(err, results) { 
    price = results.price; 
    //start the server afer the sql connection has called back 
    server = http.createServer(function (request, response) { 
     handler(request); //response depend on price 
    }).listen(8012); 
}); 

然而這會導致所謂「金字塔碼」,可以很快變得難以管理。

我個人偏好解決這個問題的方法是使用異步庫[https://github.com/caolan/async],其中包含處理節點序列問題的工具庫。我選擇這個是因爲它對我來說似乎是最直觀的方式。

var async = require('async'); 

functon query(callback){ 
var price = -1; 
var userId = 'some user provided value'; 
var sql = 'SELECT max(price) FROM users WHERE id = ' + connection.escape(userId); 
connection.query(sql, function(err, results) { 
    price = results.price; 
    callback(); 
}); 

} 

    function boot(callback){ 
    server = http.createServer(function (request, response) { 
      handler(request); //response depend on price 
      callback(); 
    }).listen(8012); 
    } 

    async.series([query,boot]); 

您可以使用npm install async安裝異步。

或者合理使用這個問題的第三種方法是使用promise。這些都是很好的接受,雖然學習節點來自其他JavaScript的語言,但我發現這很難適應來自JavaScript以外的語言,但使用JQuery的程序員似乎贊成這種方法。有一個關於如何在node.js中使用諾言的教程:http://howtonode.org/promises

蒂姆當然在這些方法的演講中提供了更深入的分析和比較,並提供了一些有關我們如何在未來。

您可能還會發現Express,Restify和Restler模塊可用作創建Restful api的方式。

*免責聲明,因爲我沒有安裝MySQL的我還沒有運行該代碼 - 機會在這裏編輯:)

+0

感謝您的幫助,我會看看異步庫。 – linbo

+0

var price = -1;我想這應該是功能查詢()的範圍。 – linbo

相關問題