Ошибка в функции async
приводит к отклонению возвращенного Promise
.
... но если ничего не используется, то Promise
:
const handler = async () => {
try {
const screenshotPath = '';
const callback = async () => {
screenshotPath = 'redefined';
}
const promise = callback(); // <= promise will reject...
} catch (err) {
console.log('in catch'); // ...but this never runs
}
console.log('finished');
}
handler();
... тогда ничего не происходит.
Это называется отклонением необработанного обещания .
С другой стороны, если тот же Promise
является await
-едом, то улов будет вызываться:
const handler = async () => {
try {
const screenshotPath = '';
const callback = async () => {
screenshotPath = 'redefined';
}
await callback();
} catch (err) {
console.log('in catch'); // this runs!
}
console.log('finished');
}
handler();
Таким образом, поскольку ошибка возникает при обратном вызове async
, возвращаемый ей Promise
будет отклонен, но, поскольку ничего не использует этот отклоненный Promise
, ничего не происходит.
Решение
Похоже, ваша mkdirp
функция следует ...
распространенный стиль обратного вызова с ошибкой, т. Е. * Обратный вызов (err, value) => ...
в качестве последнего аргумента
... так что вы можете использовать Node's util.promisify
для создания версии mkdirp
, которая возвращает Promise
:
const util = require('util');
const mkdirpPromisified = util.promisify(mkdirp);
const handler = async(request, reply) => {
try {
let screenshotPath = ''
let folderName = `./public/applications/${applicationId}`
let filepath = `${folderName}/${className}.png`
await mkdirpPromisified(folderName)
await imageUpload(file, className, filepath)
if (err) {
return reply({ success: false, message: err.message, data: null })
}
screenshotPath = filepath
const screen = await Event.findOne({ })
} catch (err) {
console.log({ err })
return reply({ success: false, message: err.message, data: null })
}
}