> # 厳密には2)でデータ取得される前に3)の処理へ移ってしまう
3) の処理を、2) のコールバック関数の中に書きましょう。
// 2)
var sql2 = 'select ...';
client.query(sql2, function(err, results, fields) {
// 3)
var sql3 = 'select ...'
client.query(sql3, function(err, result, fields) {
// 4) 画面を返すとか
});
});
Date: Wed, 15 Jun 2011 03:27:09 -0700 (PDT)
From: koexuka <koe...@gmail.com>
Subject: [nodejs_jp:320] node.js + mysql 非同期ではない処理
--
{
name: "Koichi Kobayashi",
mail: "koi...@improvement.jp",
blog: "http://d.hatena.ne.jp/koichik/",
twitter: "@koichik"
}
恐らく今のコードは2)と3)のclient.query()を並べて書いている感じになっているのだと思います。
そうではなく、client.query()の引数にcallback関数を指定して
client.query('select id from foo', function(err, results, fields) { // 2)の取得
var fooId = results[0].id;
client.query('select data from bar where foo_id = ?', [fooId],
function(err, results, fields) { // 3)の取得
var data = results[0].data;
// dataを使った処理
});
});
みたいな感じに、2)の処理の中に3)の処理をネストして記述するという形にすれば大丈夫です。
これが多くなるとどんどんネストが深くなっていくので、その際は
http://www.infoq.com/jp/articles/surviving-asynchronous-programming-in-javascript
に出ているようなモジュールを使って工夫することになると思います。
2011/6/15 koexuka <koe...@gmail.com>:
--
Toshihiro Shimizu / @meso
非同期ではない、戻り値を返す API:
var result = MyOriginalModule.isAuth(req.userId);
if (result) {
...
}
は、次のように非同期な API にします。
MyOriginalModule.isAuth(req.userId, function(err, result) {
if (result) {
...
}
});
Node の世界では、非同期な API には次の約束に従うことになってます。
・非同期 API は最後の引数でコールバック関数を受け取る。
・コールバック関数の最初の引数でエラーを示す (エラーがない場合は null)。
標準モジュールでは、ファイルシステムの API が参考になります。
http://nodejs.jp/nodejs.org_ja/api/fs.html
isAuth() の実装では、
module.exports.isAuth = function(userId, callback) {
// MySQLへ接続し、userIdが存在するかどうか認証を行う。
client.query(sql, function(err, result, fields) {
if (err) {
// エラー
return callback(err);
}
if (...) {
//認証OK
callback(null, true);
} else {
//認証NG
callback(null, false);
}
});
}
のように、MySQL にアクセスしたコールバック関数の中で、
引数で受け取ったコールバック関数を呼び出します。
Date: Wed, 15 Jun 2011 04:16:46 -0700 (PDT)
From: koexuka <koe...@gmail.com>
Subject: [nodejs_jp:325] Re: node.js + mysql 非同期ではない処理
--