0

Nodeの学習を開始し、Tediousを使用してDBに接続してクエリを実行しています。

db次の関数をエクスポートするモジュール を作成しました。

exports.connect = function(callback) {
    console.log("\n** 1. open db");
    db = new Connection(local.config.db_config);
    db.on("connect", callback);
};

exports.disconnect = function(callback) {
    console.log("db.disconnect");
    if (!db) {
        return;
    }

    db.on("close", callback);
};

exports.query = function(cbQuery, cbRow, cbDone) {
    var Request = require("tedious").Request,
        request = new Request("SELECT * FROM Clients", cbQuery);

    if (typeof(cbRow) === "function") {
        request.on("row", cbRow);
    }

    if (typeof(cbDone) === "function") {
        request.on("done", cbDone);
    }

    db.execSql(request);
};

server.js次に、以下を使用してエクスポートされた関数を呼び出す標準があります。

var dbConnected = function(err) {
        if (err) {
            console.error("** FATAL ERROR ON CONNECT: ");
            console.error(err);
            process.exit(-1);
        }
        console.log("DB connected");

        db.query(dbQueryCallback, dbOnRows, dbOnDone);
    },
    dbDisconnected = function (err) {
        console.log("dbDisconnected");
        if (err) {
            console.error("** FATAL ERROR ON DISCONNECT: ");
            console.error(err);
            process.exit(-1);
        }

        console.log("DB disconnected");
    },
    dbQueryCallback = function (err, rowCount, rows) {
        if (err) {
            console.error("ERROR DURING QUERY:");
            console.error(err);
            process.exit(-1);
        }
        console.log("Query rowCount = " + rowCount);
    },
    dbOnRows = function(columns) {
        columns.forEach(function(column) {
            if (column.value === null) {
                console.log("NULL");
            } else {
                console.log(column.metadata.colName + ": " + column.value);
            }
        });
    },
    dbOnDone = function(rowCount, more, rows) {
        console.log("done");

        db.disconnect(dbDisconnected);
    };

db.connect(dbConnected);

実行すると、DB 接続が正常に開かれ、単純なクエリが実行され、その結果が (dbOnRowsハンドラーによって) コンソールに書き込まれます。

ただし、dbOnDoneハンドラーがトリガーされることはないため、接続が閉じられることはありません。

dbOnDoneトリガーされない理由を説明できる人はいますか?

4

1 に答える 1

3

この問題を部分的に解決しました。「done」から「doneProc」に切り替えたところ、最後の「row」イベントが発生した後にこのイベントを受け取りましたが、構成で接続を設定したにもかかわらず、「rows」引数がありません (どういうわけか空になります)。http://pekim.github.io/tedious/api-request.htmlに記載されている options.rowCollectionOnDone = true 。したがって、結果を取得するために、「行」イベントとグローバルな「jsonArray」変数を引き続き使用しますが、少なくともこの「jsonArray」がいつ使用できるようになるかがわかります。コードは次のとおりです。

var jsonArray = [];

function selectStatement(sql,callback) {

    request = new Request(sql, function (err) {
        if (err) {
            console.log(err);
        }
    });

    //reset the jsonArray
    jsonArray = [];

    request.on('row', function (columns) {
        var rowObject = {};
        columns.forEach(function (column) {
            if (column.value === null) {
                console.log('NULL');
            } else {

                rowObject[column.metadata.colName] = column.value;
            }
        });

        jsonArray.push(rowObject);

    });

    request.on('doneProc', function (rowCount, more, returnStatus, rows) {
        //console.log(rowCount + ' rows returned');
        console.log(rows) // this is the full array of row objects
    });

    connection.execSql(request);
}
于 2016-01-22T14:44:15.487 に答える