【问题标题】:NodeJS program is not exiting after throwing an error UnhandledPromiseRejection抛出错误 UnhandledPromiseRejection 后 NodeJS 程序未退出
【发布时间】:2020-12-26 10:28:00
【问题描述】:

我有一个用 JavaScript 编写的函数。我正在尝试调用一个从我的主函数执行一些工作的函数。我在调用函数中设置了一个条件来查找员工 ID,如果为 null,那么我将返回错误并希望从我的主函数中正常退出。但是这件事并没有发生。程序继续执行下一个代码和函数,并出现以下错误:-

{ "errorType": "Runtime.UnhandledPromiseRejection", "errorMessage": "错误:员工编号为必填项", “原因”: { "errorType": "错误", "errorMessage": "员工编号为必填项", “堆”: [ "错误:员工编号为必填项", " 在 /var/task/index.js:64:23", " 在 Array.forEach ()", " 在 transformData (/var/task/index.js:58:22)", " 在 /var/task/index.js:207:43", " 在 processTicksAndRejections (internal/process/task_queues.js:97:5)", " 在异步 Promise.all (index 0)", “在异步 Runtime.exports.lambdaHandler [作为处理程序] (/var/task/index.js:258:5)” ] }, “承诺”: {}, “堆”: [ “Runtime.UnhandledPromiseRejection:错误:员工编号是强制性的”, " 在进程中。(/var/runtime/index.js:35:15)", " 在 process.emit (events.js:315:20)", " 在 process.EventEmitter.emit (domain.js:482:12)", " 在 processPromiseRejections (internal/process/promises.js:209:33)", “在 processTicksAndRejections (internal/process/task_queues.js:98:32)” ] }

主要功能代码sn-p:-

try{
      const data = await transformData(list, mymap, tenantId);
      if (data === null || data === undefined) {
        throw Error(`Error in transforming the data`);
      }
      const syncDataResponse = await syncDetails(tenantId!, data); //Calling is going here
 } catch (err) {
    console.log(err);
}

调用函数:-

const transformData = async (list: any, mymap: Map<string, string>, tenantId: string) => {
  const data = [];
  try {
    await list.forEach(async (obj: { [x: string]: any; employee_number?: any; }) => {
      modifyKeys(obj, mymap);

      if (obj && obj.employee_number) {
        data.push({ employeeId: obj.employee_number, employeeDetails: obj });
      } else {
        throw Error(`Employee number is mandatory`);
      }

    });
  } catch (err) {
    console.log('Error while transforming the data::', err);
    return err;
  }
  return data;
}

当员工 id 为 null 时在 transformData 函数中抛出错误时,我期待程序正常退出,但在我的 main 方法中,程序确实执行了名为 syncDetails() 的下一个函数,我得到了这个 unhandledpromiserejection错误。

请建议。干杯

【问题讨论】:

    标签: javascript node.js es6-promise


    【解决方案1】:

    transformData 中的forEach 转换为for ... of 或传统的for loop

    虽然forEach 本质上是同步的,但它确实识别async 函数。

    有关更多信息,请参阅这些文章 -

    article 1

    article 2

    【讨论】:

      【解决方案2】:

      在 transformData 中,您正在使用 list.foreach 方法,您的承诺将进入循环并且它们是连续抛出错误。

      我建议不要使用 list.foreach,而是使用 Promise.All

      【讨论】:

      • forEach 本质上是 NOT 异步的。它本质上是同步的。它只是不知道async 函数是什么
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      • 2019-10-20
      • 1970-01-01
      • 2011-09-23
      • 2017-10-23
      • 2018-02-11
      相关资源
      最近更新 更多