Javascript 节点/繁琐的不触发“;“完成”;事件
我已经开始学习Node,正在使用Teduous连接和查询数据库 我编写了一个模块,Javascript 节点/繁琐的不触发“;“完成”;事件,javascript,node.js,tedious,Javascript,Node.js,Tedious,我已经开始学习Node,正在使用Teduous连接和查询数据库 我编写了一个模块,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(callbac
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'参数(不知何故它是空的),即使我设置了config.options.rowCollectionOnDone=true的连接,如中所述。因此,为了得到结果,我仍然使用'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);
}
部分解决了这个问题。我从'done'切换到'doneProc',现在我确实在最后一个'row'事件被触发后收到了这个事件,但是没有'rows'参数(不知何故它是空的),即使我设置了config.options.rowCollectionOnDone=true的连接,如中所述。因此,为了得到结果,我仍然使用'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);
}
我们在谈论什么
connection.close()
作为executeStatement
方法的一部分被调用…嗯。。。你看过我在问题中提供的JavaScript吗?它与您引用的示例JavaScript不同。是的,我已经研究过,并尝试将其与乏味的-进行比较,例如,在乏味的中没有类似.close
的事件。这是来自一些文档吗?close
事件在本页有详细说明:但无论如何,close
事件不是我的问题;我的问题主要是为什么没有触发dbOnDone
事件?我们在谈论什么connection.close()
作为executeStatement
方法的一部分被调用…嗯。。。你看过我在问题中提供的JavaScript吗?它与您引用的示例JavaScript不同。是的,我已经研究过,并尝试将其与乏味的-进行比较,例如,在乏味的中没有类似.close
的事件。这是来自一些文档吗?close
事件在本页有详细说明:但无论如何,close
事件不是我的问题;我的问题主要是为什么没有触发dbOnDone
事件?