【问题标题】:Try/catch not catching all errors in express async functions?尝试/捕获未捕获快速异步函数中的所有错误?
【发布时间】:2020-09-12 18:35:57
【问题描述】:

我有以下代码。

但是,它并没有捕获所有错误,我仍然收到“throw er; // Unhandled 'error' event”。

这是为什么?

app.post('/api/properties/zip/:zip/bedrooms/:bedrooms', async (req, res, next) => {
  try {
    const file = await apiCall(req.params.zip, req.params.bedrooms);
    const records = await parse(file);
    const seq = await sequelize();
    const result = await dbImport(seq, records);
    return await res.status(200).json(`${result.length} properties successfully imported to the database`);
  } catch (err) {
    return next(err);
  }
});

// Middleware error handling
app.use((err, req, res, next) => {
  console.error(err.message);
  if (!err.statusCode) err.statusCode = 500;
  return res.status(err.statusCode).json(err.message);
});

例如,它没有在 parse() 函数中捕获错误,直到我添加了特定的错误处理程序。即使不添加这个,我的 try/catch 不应该捕捉到这个错误吗?

const fs = require('fs');

const parse = filename => new Promise(((resolve, reject) => {
  // Converts a line from the file, parses it to JSON, and stores it an array
  const func = (data, records) => {
    const json = JSON.parse(data);
    records.push(json);
  };

  // Read in each line of the file and pass that line to func
  const readLines = (input) => {
    const records = [];
    let remaining = '';


    // ******** HAD TO ADD THIS *********
    input.on('error', (err) => {
      reject(err);
    });


    input.on('data', (data) => {
      remaining += data;
      let index = remaining.indexOf('\n');
      let last = 0;
      while (index > -1) {
        const line = remaining.substring(last, index);
        last = index + 1;
        func(line, records);
        index = remaining.indexOf('\n', last);
      }
      remaining = remaining.substring(last);
    });

    input.on('end', () => {
      if (remaining.length > 0) {
        func(remaining, records);
      }
      resolve(records);
    });
  };

  const input = fs.createReadStream(filename);
  readLines(input, func);
}));

module.exports = parse;

提前致谢!

【问题讨论】:

  • 您的问题是为什么必须将呼叫添加到reject(...)?要兑现您的承诺,您必须调用 resolve 或拒绝。只有通过拒绝,您才能catch rejected(即在await 调用者的上下文中,thrown)值。
  • @chase 谢谢,我明白了。我认为无论它们是否被发送到reject(),它都会捕获其中的所有错误。
  • 如果您能够将 Promise 重写为异步函数,那么它将按您的预期工作(加上简化代码)。该问题仅在您直接使用 Promise 原语时存在,您必须显式调用 resolve 或 reject。
  • 好吧听起来不错。我会试试的。如果你愿意,你仍然可以调用resolve和reject吗?
  • 你的意思是如果你让它成为一个异步函数?如果您将 Promise-returning 函数更改为异步函数,则不再显式解析和拒绝。您要么return 一个值(行为类似于resolve),要么错误是thrown(行为类似于reject)。见:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

标签: javascript node.js express error-handling try-catch


【解决方案1】:

也许这将向您展示在使用 await 时 try/catch 将如何工作。当一个 promise 是 rejected 时,它会 throw 结果值。如果基础承诺 resolves 它将返回该值。

(async () => {
  try {
    const val1 = await Promise.resolve('resolved val');
    const val2 = await Promise.reject('reject val');
    console.log(val1);
  } catch (err) {
    console.error(err);
  }
})();

【讨论】:

    猜你喜欢
    • 2018-04-20
    • 2014-05-11
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多