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
トリガーされない理由を説明できる人はいますか?