ウェブサイト検索

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