0

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

4

2 回答 2

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。这些都被很好地接受了,在学习 node 来自其他 javascript 的语言时,我发现这很难适应来自 javascript 之外的其他语言,但是使用 JQuery 的程序员似乎更喜欢这种方法。这里有一个关于如何在 node.js 中使用 Promise 的教程:http: //howtonode.org/promises

当然,蒂姆在他对这些方法的讲座中提供了更深入的分析和比较,并提供了一些关于我们将来如何做到这一点的见解。

您可能还会发现 Express、Restify 和 Restler 模块可用作创建 Restful api 的一种方式。

*免责声明我没有运行此代码,因为我没有安装 mysql - 在这里进行编辑的机会:)

于 2013-07-26T09:55:58.713 回答
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); 
});
于 2013-07-26T05:43:22.370 回答