一个简单的问题,我将nodejs用于HTTP restful API服务。现在我想在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 :(得分:1)
虽然这是一个简单的问题,答案的大小是巨大的! Tim Ruffles 本周(2013年7月)在伦敦节点用户组上发表了关于这个主题的整个演讲,该演讲可以作为视频讲座[http:// www.youtube.com/watch?v=nHXKA82M-LY]。
这里的问题是在异步(无顺序保证)编程环境中工作时如何处理需要同步(按顺序)完成的事情的基本问题。
在Tim用来解决这个问题的方式列表中,有三个似乎可以帮助你。
正如其他帖子中所建议的那样,您可以使用代码中的回调:
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安装async。
或者可能合理地用于此问题的第三种方法是使用承诺。这些都被广泛接受,当学习节点来自其他javascript语言时,我发现这很难适应来自javascript以外的语言,但使用JQuery的程序员似乎更喜欢这种方法。这里有一个关于如何在node.js中使用promises的教程:http://howtonode.org/promises
当然,Tim在他关于这些方法的讲座中提供了更深入的分析和比较,并提供了一些关于我们将来如何做到这一点的见解。您可能还会发现Express,Restify和Restler模块可用作创建Restful api的方法。
*免责声明我没有运行此代码,因为我没有安装mysql - 在这里编辑的机会:)
答案 1 :(得分: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);
});