我正在尝试为我正在从事的Udacity项目编写一个非常简单的API端点。当我尝试对以下端点进行邮递时,会收到承诺拒绝警告。我首先使用此端点内的3条注释行尝试了此操作,但由于它是异步运行的,因此在运行删除功能导致文件未找到之前,该文件可能尚未准备好。
有什么建议吗?
app.get( "/filteredimage", async ( req, res ) => {
var re = req.query.image_url;
if (!re){
return res.status(400).send(`id is required`);
}
var myfun = function (data, callback) {
var filteredpath = filterImageFromURL(data);
callback([filteredpath]);
};
myfun(re,deleteLocalFiles);
// let filteredpath = filterImageFromURL(re);
// res.sendFile(filteredpath);
// deleteLocalFiles([filteredpath]);
} );
以下是util函数:
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);
});
});
}
// deleteLocalFiles
// helper function to delete files on the local disk
// useful to cleanup after tasks
// INPUTS
// files: Array<string> an array of absolute paths to files
export async function deleteLocalFiles(files:Array<string>){
for( let file of files) {
fs.unlinkSync(file);
}
}
对于TypeScript来说不多,但我看到了一些问题:
一个,您不必将Promise放在异步函数中,因为异步函数是Promise。第二,您没有正确等待filterImageFromURL()
。第三,应该使用try/catch
块,以免出现Unhandled Promise Rejection
错误。
原谅我从您的TS中剥离。
app.get( "/filteredimage", async ( req, res ) => {
var myfun = async function (data, callback) {
try {
var filteredpath = await filterImageFromURL(data);
callback([filteredpath]);
} catch(err) {
console.error(err);
}
};
try {
var re = req.query.image_url;
if (!re) {
return res.status(400).send(`id is required`);
}
await myfun(re, deleteLocalFiles);
// let filteredpath = filterImageFromURL(re);
// res.sendFile(filteredpath);
// deleteLocalFiles([filteredpath]);
} catch(err) {
console.error(err);
}
});
export async function filterImageFromURL(inputUR) {
try {
const photo = await Jimp.read(inputURL);
const outpath = '/tmp/filtered.'+Math.floor(Math.random() * 2000)+'.jpg';
const img = photo
.resize(256, 256) // resize
.quality(60) // set JPEG quality
.greyscale() // set greyscale
.write(__dirname+outpath);
return img
} catch(err) {
console.error(err);
}
}