【发布时间】: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 或拒绝。只有通过拒绝,您才能catchrejected(即在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