NodeJs中的简单API端点

问题描述 投票:0回答:1

我正在尝试为我正在从事的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);
    }
}

node.js asynchronous callback
1个回答
1
投票

对于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);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.