如何在nodejs中启动http服务器之前查询mysql

时间:2013-07-26 04:40:42

标签: mysql node.js node.js-client

一个简单的问题,我将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服务器代码?

2 个答案:

答案 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); 
});