Javascript Node.js JIMP在保存文件后重新启动应用程序

Javascript Node.js JIMP在保存文件后重新启动应用程序,javascript,node.js,Javascript,Node.js,我有一个这么小的应用程序,我正在使用JIMP。我的目标是在jpeg文件上添加水印。我的应用程序的主要部分工作正常,但我想为用户添加一个“重试”功能。现在,这部分不起作用。在保存我编辑的文件之前调用了重试部分 const Jimp = require('jimp'); const inquirer = require('inquirer'); const fs = require('fs'); const addTextWatermarkToImage = async function(inpu

我有一个这么小的应用程序,我正在使用JIMP。我的目标是在jpeg文件上添加水印。我的应用程序的主要部分工作正常,但我想为用户添加一个“重试”功能。现在,这部分不起作用。在保存我编辑的文件之前调用了重试部分

const Jimp = require('jimp');
const inquirer = require('inquirer');
const fs = require('fs');

const addTextWatermarkToImage = async function(inputFile, outputFile, text) {
  try {
    const image = await Jimp.read(inputFile);
    const font = await Jimp.loadFont(Jimp.FONT_SANS_32_BLACK);
    const textData = {
      text: text,
      alignmentX: Jimp.HORIZONTAL_ALIGN_CENTER,
      alignmentY: Jimp.VERTICAL_ALIGN_MIDDLE,
    };
    image.print(font, 10, 10, textData, image.getWidth(), image.getHeight());
    image.quality(100).write(outputFile);
  } catch (error) {
    console.log('Error. Something went wrong');
  }
};

const addImageWatermarkToImage = async function(
  inputFile,
  outputFile,
  watermarkFile
) {
  try {
    const image = await Jimp.read(inputFile);
    const watermark = await Jimp.read(watermarkFile);
    const x = image.getWidth() / 2 - watermark.getWidth() / 2;
    const y = image.getHeight() / 2 - watermark.getHeight() / 2;

    image.composite(watermark, x, y, {
      mode: Jimp.BLEND_SOURCE_OVER,
      opacitySource: 0.5,
    });

    image.quality(100).write(outputFile);
  } catch (error) {
    console.log('Error. Something went wrong');
  }
};

const prepareOutputFilename = filename => {
  const [name, ext] = filename.split('.');
  return `${name}-with-watermark.${ext}`;
};

const startApp = async () => {
  //check if user is ready
  const answer = await inquirer.prompt([
    {
      name: 'start',
      message:
        'Hi! This is "Watermar manager". Move your files to `/img` folder. Then you\'ll be able to use them in the app. Are you ready?',
      type: 'confirm',
    },
  ]);

  // if no - exit app
  if (!answer.start) process.exit();

  // ask about input file and watermark type
  const options = await inquirer.prompt([
    {
      name: 'inputImage',
      type: 'input',
      message: 'What file do you want to mark?',
      default: 'test.jpg',
    },
    {
      name: 'watermarkType',
      type: 'list',
      choices: ['Text watermark', 'Image watermark'],
    },
  ]);
  if (options.watermarkType === 'Text watermark') {
    const text = await inquirer.prompt([
      {
        name: 'value',
        type: 'input',
        message: 'Type your watermark text:',
      },
    ]);
    options.watermarkText = text.value;
    if (fs.existsSync('./img/' + options.inputImage) === true) {
      addTextWatermarkToImage(
        './img/' + options.inputImage,
        './img/' + prepareOutputFilename(options.inputImage),
        options.watermarkText
      );
    } else {
      console.log('O_o Error!!!! No such file');
    }
  } else {
    const image = await inquirer.prompt([
      {
        name: 'filename',
        type: 'input',
        message: 'Type your watermark name:',
        default: 'logo.png',
      },
    ]);
    options.watermarkImage = image.filename;
    if (
      fs.existsSync('./img/' + options.inputImage) === true &&
      fs.existsSync('./img/' + options.watermarkImage) === true
    ) {
      addImageWatermarkToImage(
        './img/' + options.inputImage,
        './img/' + prepareOutputFilename(options.inputImage),
        './img/' + options.watermarkImage
      );
    } else {
      console.log('O_o Error!!!! No such file');
    }
  }

  console.log('File was saved - now');

const retry = await inquirer.prompt([
    {
      name: 'retry',
      message: 'Do you want to try again',
      type: 'confirm',
    },
  ]);
  if (!retry.retry) process.exit();
  startApp();
};

startApp();
我想在保存文件后重新运行此应用程序。现在

const retry = await inquirer.prompt([
    {
      name: 'retry',
      message: 'Do you want to try again',
      type: 'confirm',
    },
  ]);
  if (!retry.retry) process.exit();
  startApp();
这部分代码在保存文件之前运行,这可能会导致一些问题。
关于如何处理这个问题有什么建议吗?

您正在调用一些不使用WAIT语句的异步方法(addImageWatermarkToImage,addImageWatermarkToImage)。使用wait和check

//考虑以下示例。使用awit和不使用awit执行测试方法,这可能有助于您理解
功能超时(毫秒){
返回新承诺(resolve=>setTimeout(resolve,ms));
}
异步函数睡眠(fn,…args){
等待超时(3000);
返回fn(…args);
}
异步函数测试(){
//添加和删除下面的等待并执行此功能
等待睡眠(()=>{console.log(“先运行”)},{});
log(“第二次运行”);
}
test();

像这里吗?``options.watermarkText=text.value;如果(fs.existsSync('./img/'+options.inputImage)==true){addTextWatermarkToImage('./img/'+options.inputImage'./img/'+prepareOutputFilename(options.inputImage),options.watermarkText)```