3

私は今、少しばかげていると感じています。私はnodejsとjavaScriptにかなり慣れていないので、これを理解できません。mysqlへのクエリの非同期の性質のためだと思います...

私の問題を示す例を作成しました。多数のSQLクエリを循環させて、結果を処理したいだけです。例のために、私はただ印刷します。このような単一の SQL クエリを使用できることはわかっています"SELECT id, name FROM player WHERE id IN (1,2,3,4,5)"が、これは、作成しようとしている実際のアプリケーションでは不可能です。

これは私のnodejs app.jsの関連部分です

var mysql = require("mysql");
var mysqlPool = mysql.createPool(conf.mysqlArbData);

for (var i = 0; i<5; i++){

    mysqlPool.getConnection(function(err, connection) {

        var detailSql = "SELECT id, name FROM player " +
            "WHERE id = "+i;
        if (err){
            throw err;
        }
        connection.query(detailSql, function(err, detailRows, fields) {
            connection.end();
            console.log("detailSql="+detailSql);
            if (err){
                console.log("can't run query=" + detailSql +"\n Error="+err);
            }
            else{

                console.log(detailRows[0].id + " " +detailRows[0].name);

            }

        });
    });

};

出力は次のとおりです。

web server listening on port 3000 in development mode
detailSql=SELECT id, name FROM player WHERE id = 5
5 Jyvaskyla
detailSql=SELECT id, name FROM player WHERE id = 5
5 Jyvaskyla
detailSql=SELECT id, name FROM player WHERE id = 5
5 Jyvaskyla
detailSql=SELECT id, name FROM player WHERE id = 5
5 Jyvaskyla
detailSql=SELECT id, name FROM player WHERE id = 5
5 Jyvaskyla

私の質問は、id=5 のデータベース エントリの結果しか得られないのはなぜですか? コールバックで個々の結果を受け取るには、何を変更する必要がありますか?

4

3 に答える 3

1

ノードの場合、letステートメントを使用できます。iforループでスコープを制限します。

for (let i = 0; i<5; i++) {
  mysqlPool.getConnection(function(err, connection) {
    console.log(i);
  });
};
于 2016-03-24T10:54:57.870 に答える