0

簡単な質問ですが、私は HTTP RESTful API サービスに nodejs を使用しています。ここで、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 月)の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 で async をインストールできます。

または、この問題に合理的に使用できる 3 番目のアプローチは、promise を使用することです。これらは広く受け入れられており、javascript 以外の言語からのノードを学習しているときに、javascript 以外の言語からのノードに適応するのは非常に難しいことがわかりましたが、JQuery を使用するプログラマーはこのアプローチを好むようです。ここに node.js でプロミスを使用する方法のチュートリアルがあります: http://howtonode.org/promises

もちろん、Tim はこれらのアプローチの講義でより詳細な分析と比較を提供し、将来これを行う方法についていくつかの洞察を提供します。

また、Restful API を作成する方法として、Express、Restify、および Restler モジュールが役立つ場合もあります。

*免責事項 mysql がインストールされていないため、このコードを実行していません - ここで編集する機会があります :)

于 2013-07-26T09:55:58.713 に答える
0

次のように、接続クエリの return コールバック内にサーバーを追加するだけです。

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 に答える