雖然這是一個簡單的問題的答案的大小是巨大的! 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的我還沒有運行該代碼 - 機會在這裏編輯:)
我認爲你需要把SQL查詢你的處理程序。對於每個用戶來說,SQL查詢的結果會不同嗎? – Nelson
@Nelson否,查詢結果像全局變量,它會導致所有請求。如果我把查詢放在處理程序中,它會每次查詢每個請求,這不是我的情況 – linbo