node.js - Node.js 和 oracledb 的问题
问题描述
我在工作时遇到了 node.js 脚本的问题(顺便说一句,我对 node 很陌生)。当我运行 forEach 循环时,似乎它可能正在异步运行,因此没有运行问题。但是,当我查看包文档时,我没有看到任何关于让 sql 执行同步运行的信息。在此先感谢您的帮助!
function getLastLoginAndProviderType(jsonObj, connection){
console.log(jsonObj);
jsonObj.forEach(obj => {
console.log("Processing: " + obj["email"]);
//obj["email"], obj["first"], obj["last"], obj["eid"], obj["role"]
var sql = "select LAST_LOGGED_IN_TIME from EINV_OWNER.CONTACT where EMAIL_ADDRESS='" + obj['email'] + "'";
connection.execute(
sql, {}, { maxRows: 15 },
function(err, result) {
if (err) {
console.error("Query Error: " + err.message);
} else {
console.log("Number of rows returned: " + result.rows.length);
obj["lastLoggedIn"] = "null";
obj["supplierOrProvider"] = "null";
}
});
});
当脚本运行时,我希望看到如下内容:
Processing: XXX@XXX.com
Number of rows returned: XX
Processing: XXX@XXX.com
Number of rows returned: XX
...
Processing: XXX@XXX.com
Number of rows returned: XX
但是,我最终得到的是:
Processing: XXX@XXX.com
Processing: XXX@XXX.com
Processing: XXX@XXX.com
...
Processing: XXX@XXX.com
Query Error: NJS-003: invalid connection
Query Error: NJS-003: invalid connection
Query Error: NJS-003: invalid connection
...
Query Error: NJS-003: invalid connection
有任何想法吗?谢谢!
解决方案
基本选项的快速概述:
回调
使用像https://github.com/caolan/async这样的包来轻松管理回调的“for循环”。(还有其他包)
forEach
不会等待您的回调完成,这就是它们同时运行的原因。您还可以通过使用带有迭代器的回调来管理自己的 for 循环,该迭代器在达到最大迭代器时停止。
但你也可以使用:
require('util').promisify
转换 node.js 样式的回调函数
myFn(foo,bar,<function(err,data){}>)
承诺,然后您可以执行以下操作:
承诺
异步/等待
或者你可能想要的...
async function myFunction(){
for(i=0;i<jsonObj.length;i++){
try{
let result = await connection.execute(sql, {}, { maxRows: 15 })
console.log("Number of rows returned: " + result.rows.length);
obj["lastLoggedIn"] = "null";
obj["supplierOrProvider"] = "null";
}catch(e){
console.error("Query Error: " + err.message);
}
}
}
推荐阅读
- monaco-editor - 摩纳哥编辑器是否支持小地图中的增量装饰?
- python - 有没有办法将循环结果作为熊猫数据框?
- angular - Angular 使用私有库
- c++ - 提升矩阵矩阵产品定义
- android - Flutter - W/ClipboardManager(10439):不支持 ClipboardEx
- python - inspect.isabstract 在抽象类上返回 false
- javascript - 如何定位 CSS 类名的一部分?
- java - 如何将 .jar 文件添加到 webserver 的 lib 目录?
- go - go heroku web 进程在启动后 60 秒内未能绑定到 $PORT
- sql - 子查询 - SQL SERVER:清除回车、空格和重新排序