javascript - NodeJS MySQL クエリ関数の外で結果を取得する方法
NodeJSのMySQLプールクエリの外で結果を取得する方法がどうしてもわかりません。意味をよりよく説明するために、いくつかのサンプルコードを示します。
var result = 'Hello world!';
var mysql = require('mysql');
var pool = mysql.createPool({
connectionLimit : 100,
host : process.env.DB_HOST,
user : process.env.DB_USERNAME,
password : process.env.DB_PASSWORD,
database : process.env.DB_DATABASE
});
pool.query('SELECT * from user LIMIT 10', function (err, rows) {
result = rows;
});
res.send(result);
上記はクエリの代わりに'Hello world!'を返します。
もし pool.query 関数の中で console.log(result) をすると、クエリからの行は返ってきますが、関数の外ではデータを取得できないようです。関数をログに出して、関連するすべての関数を確認しましたが、基本的な何かを見落としているのだと思います。
回答 #1
クエリが完了する前(およびコールバックが呼び出される前)に結果を送信しています。コールバック内で結果を送信すると問題が解決します。
pool.query('SELECT * from user LIMIT 10', function (err, rows) {
result = rows;
res.send(result);
});
アーロンが指摘したように、これは一般的な問題です。より詳しい答えはここで見つけることができます。
回答 #2
プールのクエリ関数は非同期です。これは、あなたのコードが宣言したステートメントと同じ順序で実行されないことを意味します。
あなたはクエリを開始し、クエリの非同期操作が完了したときに実行されるコールバック関数を指定します。
res.send はクエリとコールバックの宣言の直後にすぐ実行され、コールバックはずっと後で実行されます。結果を設定する頃には、すでに送信してしまっています。
res.send をコールバックの中に移動してみてください。
pool.query('SELECT * from user LIMIT 10', function (err, rows) {
res.send(rows);
});
