javascript - NodeJS [错误] - 未定义选项属性未定义的值未定义超出范围
问题描述
我worker_threads
在 nodejs 中使用读取多个文件并处理行以稍后插入数据库(使用oracle-db
)。
大约我使用超过一百万行,每个文件都有超过 10,000 行。
当我试图创建“绑定”以插入每个行字段的数据库中时,在使用forEachAsyncParallel
或承诺每一行时出现.map
以下错误:
错误
RangeError: Value undefined out of range for undefined options property undefined
at Set.add (<anonymous>)
at AsyncHook.init (internal/inspector_async_hook.js:23:25)
at PromiseWrap.emitInitNative (internal/async_hooks.js:182:43)
at /app/services/workers/PushMultiValueFile.worker.js:1:1
at new Promise (<anonymous>)
at /app/services/workers/PushMultiValueFile.worker.js:20:84
at Array.map (<anonymous>)
at /app/services/workers/PushMultiValueFile.worker.js:20:57
at new Promise (<anonymous>)
at AssignKeysNameOnValues (/app/services/workers/PushMultiValueFile.worker.js:16:12)
RangeError: Value undefined out of range for undefined options property undefined
at Set.add (<anonymous>)
at AsyncHook.init (internal/inspector_async_hook.js:23:25)
at PromiseWrap.emitInitNative (internal/async_hooks.js:182:43)
at Promise.then (<anonymous>)
at processTicksAndRejections (internal/process/task_queues.js:97:5)
-----------------------
***Custom code to read error:***
[2021-03-10T19:34:47.331Z]
{
captured_at: 2021-03-10T19:34:47.000Z,
messages: '"Error: Worker stopped with exit code 1"',
stacktrace: '"Error: Error: Worker stopped with exit code 1\\n at /app/services/oracle_database.js:434:36\\n at processTicksAndRejections (internal/process/task_queues.js:97:5)"',
execution_detail_id: 1203
}
有办法解决这个问题吗?
带有 Promise 的地图
function AssignKeysNameOnValues(keys, values) {
return new Promise( async (resolve, reject) => {
try {
let result = {};
if (Object.entries(keys).length > 0) {
const promises = (Object.entries(keys)).map( async (item,index) => new Promise( async (resolve, reject) => {
try{
if ([(oracledb.DB_TYPE_NUMBER)].includes(item[1].type)) {
result[item[0]] = values[index] ? parseFloat(values[index]) : null;
resolve()
}
else {
result[item[0]] = values[index];
resolve()
}
} catch (e) {
// throw await logError(new Error(error),(workerData.executionID));
reject();
}
}));
Promise.all(promises)
.then(() => {
resolve(result);
})
.catch((err) => {
reject(err);
});
}
else {
resolve();
}
} catch (err) {
reject(err);
}
});
}
参数接收:
键:
{
ARRANGEMENT_ID: {
type: 2001,
maxSize: 255,
},
OWNER: {
type: 2001,
maxSize: 255,
},
LINKED_APPL: {
type: 2001,
maxSize: 255,
}
}
价值观:
{
"0": "ARR16@#$%3423C0",
"1": "1",
"2": "42"
}
其他类型来迭代相同的值,但我得到了同样的错误。
forEachAsyncParallel
Array.prototype.forEachAsyncParallel = async function (fn) {
await Promise.all(this.map(fn));
}
版本:
- 节点:v12.18.4
- 下午:6.14.6
解决方案
推荐阅读
- android - Gridlayout中均匀定位的Cardviews
- javascript - 如何在反应中从履行的承诺中获得价值
- flutter - 从资产或文件中显示图片 Flutter
- swiftui - SwiftUI:没有奇怪的解决方法,@State 属性不会更新
- python - python Selenium --headless 参数触发网页端的安全特性
- android - 不确定 react-native start 命令是否正常工作
- django - Django:当令牌存储在 HttpOnly cookie 中时,如何更新 SimpleJWT 访问令牌?
- neo4j - Neo4j Cypher 从同一节点查询多个关系
- python - 如何保存上面标题的无花果?
- python - 如何用python中的特定值替换列的值?