(узел:23042) UnhandledPromiseRejectionWarning: Ошибка: не удалось найти MIME для буфера <null>
Я пытаюсь взять URL-адрес изображения с помощью выражения в Typescript, отфильтровать его и отправить изображение обратно в качестве ответа. Вот конечная точка:
app.get("/filteredimage/", async (req, res) =>{
try{
let {image_url} = req.query;
if(!image_url){
return res.status(400).send("bad request!");
}
console.log(image_url);
const path = await filterImageFromURL(image_url);
res.sendFile(path);
res.on('finish', () => deleteLocalFiles([path]));
} catch {
return res.status(500).send({error: 'Unable to process your request'});
}
});
функция URL-адреса изображения фильтра выглядит следующим образом:
export async function filterImageFromURL(inputURL: string): Promise<string>{
return new Promise( async resolve => {
const photo = await Jimp.read(inputURL);
const outpath = '/tmp/filtered.'+Math.floor(Math.random() * 2000)+'.jpg';
await photo
.resize(256, 256) // resize
.quality(60) // set JPEG quality
.greyscale() // set greyscale
.write(__dirname+outpath, (img)=>{
resolve(__dirname+outpath);
});
});
}
Но при достижении конечной точки я получаю следующую ошибку:
(node:23042) UnhandledPromiseRejectionWarning: Error: Could not find MIME for Buffer <null>
at Jimp.parseBitmap (/home/hades/udacity/cloud-developer/course-02/project/image-filter-starter-code/node_modules/@jimp/core/src/utils/image-bitmap.js:73:15)
at Jimp.call [as parseBitmap] (/home/hades/udacity/cloud-developer/course-02/project/image-filter-starter-code/node_modules/@jimp/core/src/index.js:395:17)
at parseBitmap (/home/hades/udacity/cloud-developer/course-02/project/image-filter-starter-code/node_modules/@jimp/core/src/index.js:339:14)
at cb (/home/hades/udacity/cloud-developer/course-02/project/image-filter-starter-code/node_modules/@jimp/core/src/index.js:68:14)
at cb (/home/hades/udacity/cloud-developer/course-02/project/image-filter-starter-code/node_modules/@jimp/core/src/request.js:47:9)
at IncomingMessage.<anonymous> (/home/hades/udacity/cloud-developer/course-02/project/image-filter-starter-code/node_modules/phin/lib/phin.compiled.js:1:2038)
at IncomingMessage.emit (events.js:322:22)
at endReadableNT (_stream_readable.js:1187:12)
at processTicksAndRejections (internal/process/task_queues.js:84:21)
(node:23042) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error
originated either by throwing inside of an async function without a catch block, or by
rejecting a promise which was not handled with .catch(). To terminate the node process on
unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see
https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:23042) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In
the future, promise rejections that are not handled will terminate the Node.js process with
a non-zero exit code.
Пытался добавить блоки try-catch в обе функции, но безуспешно. Что мне не хватает?
4 ответа
Я иду по тому же курсу, и проблема в том, что образец изображения ( https://timedotcom.files.wordpress.com/2019/03/kitten-report.jpg) больше не существует. Для обработки ошибок dapper требуется изменить предоставленный код утилиты:
export async function filterImageFromURL(inputURL: string): Promise<string> {
return new Promise((resolve, reject) => {
Jimp.read(inputURL).then(photo => {
const outpath = '/tmp/filtered.' + Math.floor(Math.random() * 2000) + '.jpg';
photo
.resize(256, 256) // resize
.quality(60) // set JPEG quality
.greyscale() // set greyscale
.write(__dirname + outpath, (img) => {
resolve(__dirname + outpath);
});
}).catch(err => {
console.error(err);
reject("Could not read image.");
})
});
}
С помощью этой модификации вы можете отреагировать на эту ошибку во фрагменте кода.
Я на том же курсе и столкнулся с той же проблемой. В моем случае я не применяю и не нуждаюсь в каких-либо изменениях в коде. Я бы просто добавил журнал, чтобы увидеть входной URL-адрес, который я использовал в запросе, и я понял, что отправляю URL-адрес изображения без расширения изображения, например:
curl http://localhost:8082/filteredimage?image_url=https://image.shutterstock.com/image-photo/diverse-amazon-forest-seen-above-600w-2072628056
Затем я просто исправляю URL-адрес следующим образом:
curl http://localhost:8082/filteredimage?image_url=https://image.shutterstock.com/image-photo/diverse-amazon-forest-seen-above-600w-2072628056.jpg
добавив.jpg
в конце концов, и это сработало. возможно, у вас такая же проблема.
Похоже, что ошибка не обнаруживается при вызове Jimp.read().
Пожалуйста, попробуйте следующий фрагмент.
return new Promise(async (resolve, reject) => {
try {
const photo = await Jimp.read(inputURL);
const outpath = '/tmp/filtered.' + Math.floor(Math.random() * 2000) + '.jpg';
await photo
.resize(256, 256) // resize
.quality(60) // set JPEG quality
.greyscale() // set greyscale
.write(__dirname + outpath, (img) => {
resolve(__dirname + outpath);
});
} catch (error) {
reject(error)
}
});
}
Я думаю, что нашел решение. По крайней мере, это сработало для меня:
return new Promise(async (resolve, reject) => {
try {
const photo = await Jimp.read(inputURL);
const outpath = '/tmp/filtered.' + Math.floor(Math.random() * 2000) + '.jpg';
await photo
.resize(256, 256) // resize
.quality(60) // set JPEG quality
.greyscale() // set greyscale
.write(__dirname + outpath, (img) => {
resolve(__dirname + outpath);
});
} catch (error) {
const photo = await Jimp.read(inputURL);
const outpath = '/tmp/filtered.' + Math.floor(Math.random() * 2000) + '.jpg';
await photo
.resize(256, 256) // resize
.quality(60) // set JPEG quality
.greyscale() // set greyscale
.write(__dirname + outpath, (img) => {
resolve(__dirname + outpath);
});
}
});
Когда он поймает ошибку, код снова запустится без ошибок.