【问题标题】:How to query mysql before starting http server in nodejs如何在nodejs中启动http服务器之前查询mysql
【发布时间】:2013-07-26 04:40:42
【问题描述】:

一个简单的问题,我用 nodejs 做 HTTP RESTful API 服务。现在我想在http服务器启动前查询一些mysql数据,代码sn -p:

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服务器代码呢?

【问题讨论】:

  • 我认为您需要将 SQL 查询放入您的处理程序中。不是每个用户的 SQL 查询结果都不一样吗?
  • @Nelson 不,查询结果就像全局变量一样,它是所有请求的结果。如果我将查询放在处理程序中,它将每次查询每个请求,这不是我的情况

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


【解决方案1】:

虽然这是一个简单的问题,但答案的规模很大! Tim Ruffles 本周(2013 年 7 月)在 London Node Users Group 上就该主题进行了完整的讲座,该讲座可作为视频讲座 [http:// www.youtube.com/watch?v=nHXKA82M-LY]。

这里的问题是如何在异步(无顺序保证)编程环境中处理需要同步(按顺序)完成的事情的基本问题。

在蒂姆用来处理这个问题的方法列表中,有 3 种方法似乎可以帮助你。

正如其他帖子中所建议的,您可以使用代码中的回调:

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 - 在这里进行编辑的机会:)

【讨论】:

  • 谢谢你的帮助,我去看看异步库。
  • var price = -1;我想这应该超出函数 query() 范围。
【解决方案2】:

您只需在连接查询的返回回调中添加服务器,如下所示:

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

【讨论】:

  • 谢谢,这是一个解决方案,但它会导致Mysql在http服务器工作期间保持连接吗?如果 Mysql 断开连接(通常 8 小时后它会断开连接),应用程序工作正常吗?
  • 只要您不再需要数据库,就可以正常工作。所有连接用于获取价格变量,它调用的回调实际上对它没有任何依赖关系。如果要删除mysql连接,只需调用connection.close();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
相关资源
最近更新 更多