1

使用 nodejs、express、Jimp。我无法让 Jimp 将“.print”转换为图像和“.writeAsync”,或者更准确地说,我认为问题在于我无法使用“.loadFont”和“.read”。我尝试通过嵌套在“.read”内部和外部使用“.loadFont”。我只能在没有“.print”编辑的情况下获得新保存的.png。

app.post('/invite/:email/:name', async (req,res) => {
  try {
    var email = atob(req.params.email);
    var name = atob(req.params.name);
    var data = req.body;
    const inviteImage = await makeImg(name, data);
   
  // working code for sending email with image attachment

  } catch (error) {
    return next(error);
  }
});


function makeImg(name, data) {
  return new Promise(resolve => {
    const font = Jimp.loadFont(Jimp.FONT_SANS_32_WHITE)
      .then(font => {
        return font;
      })
    Jimp.read('./imgs/casualTemplate.jpg')
      .then(image => {
        // Do stuff with the image.
        return image
          .print(font, 10, 10, `hello`)
          .writeAsync('./casualInvite.png');
      })
      .catch(err => {
        // Handle an exception.
        //return next(error);
      });
      resolve("casualInvite.png");
  });
}
    // some more code i have tried inside Promise, also tried mixing them
    /*
    const font = await Jimp.loadFont(Jimp.FONT_SANS_32_WHITE);
    const image = await Jimp.read('./imgs/casualTemplate.jpg');
    image.print(font, 10, 10, `hello`);
    await image.writeAsync('./casualInvite.png');
    resolve("casualInvite.png");
    */

我整天都在尝试我能在互联网上找到的所有方法。

4

1 回答 1

0

所以我终于让它工作了。我不完全知道为什么,但听起来它与反模式有关。未对 POST 进行任何更改;我将包装函数设为异步,并在 Promise 之前使用“await”移动了变量声明。

如果有人可以提供链接或解释发生了什么,那就太好了,我对这门语言还是很陌生。

async function makeImg(name, data) {
  // add await outside of promise
  let image = await Jimp.read('./imgs/casualTemplate.jpg');
  
  return new Promise(resolve => {
    
    Jimp.loadFont(Jimp.FONT_SANS_32_WHITE)
      .then(font => {
        image.print(font, 10, 10, `hello`);
        return image;
      }).then(image => {
        return image.writeAsync('./casualInvite.png');
      });

      resolve("casualInvite.png");
  });
}

于 2022-01-21T05:28:27.863 回答