Пытаться / поймать не все ошибки в функциях express asyn c? - PullRequest
0 голосов
/ 26 мая 2020

У меня есть следующий код.

Однако он не улавливает все ошибки, и я все еще получаю «throw er; // Необработанное событие 'error'».

Почему это?

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 (), пока я не добавил специальный обработчик ошибок c. Разве мой 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;

Заранее спасибо!

1 Ответ

1 голос
/ 26 мая 2020

Возможно, это продемонстрирует вам, как будет работать команда try / catch при использовании await. Когда обещание равно 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);
  }
})();
...