gpt4 book ai didi

javascript - Node/Tedious 未触发 "done"事件

转载 作者:行者123 更新时间:2023-11-28 18:49:30 25 4
gpt4 key购买 nike

我已经开始学习 Node,并使用 Tedious 连接和查询数据库。

我编写了一个模块 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);

运行时,数据库连接成功打开,执行一个简单的查询,并将其结果写入控制台(通过dbOnRows处理程序)。

但是,dbOnDone 处理程序永远不会被触发,因此连接永远不会关闭。

任何人都可以解释为什么 dbOnDone 没有被触发吗?

最佳答案

部分解决了这个问题。我从“done”切换到“doneProc”,现在我在最后一个“row”事件被触发后确实收到了这个事件,但没有“rows”参数(不知何故它是空的),即使我设置了与配置的连接。 options.rowCollectionOnDone = true 如 http://pekim.github.io/tedious/api-request.html 中所述。因此,为了获得结果,我仍然使用“row”事件和全局“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);
}

关于javascript - Node/Tedious 未触发 "done"事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34708533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com