【问题标题】:Simple API endpoint in NodeJsNodeJs 中的简单 API 端点
【发布时间】:2020-03-26 18:38:09
【问题描述】:

我正在尝试为我正在处理的 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】:

    对于 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);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多