Почему моя облачная функция продолжает работать, даже если она завершила задачу?

Поэтому я пытаюсь сделать миниатюру из изображения, которое было загружено в хранилище файловой базы. функция может генерировать эскиз правильно. но из журнала функций кажется, что функция по-прежнему выполняется несколько раз, даже если миниатюра была сгенерирована идеально.

как видно из журнала ниже, функция снова и снова работает с 2:37 до 2:40. Мне нужно удалить функцию из терминала, чтобы остановить функцию.

введите описание изображения здесь введите описание изображения здесь

вот код, который я использую:

export const generateEventThumbnail = functions.storage.object().onFinalize(async (object) => {

      const fileBucket = object.bucket; // The Storage bucket that contains the file.
      const filePath = object.name; // File path in the bucket.
      const contentType = object.contentType; // File content type.
      const fileName = path.basename(filePath); // Get the file name.

      console.log(filePath)
      console.log(fileName)

      if (!contentType.startsWith('image/')) {
        console.log('This is not an image.');
        return null;
      }




      try {

        // [START thumbnailGeneration]
        // Download file from bucket.
        const bucket = gcs.bucket(fileBucket);
        const tempFilePath = path.join(os.tmpdir(), fileName);
        const metadata = {contentType: contentType};
        await bucket.file(filePath).download({destination: tempFilePath})
        console.log('Image downloaded locally to', tempFilePath)

        // Generate a thumbnail using ImageMagick.
        await spawn('convert', [tempFilePath, '-thumbnail', '100x100>', tempFilePath])
        console.log('Thumbnail created at', tempFilePath)

        // We add a 'thumb_' prefix to thumbnails file name. That's where we'll upload the thumbnail.
        const thumbFileName = `${fileName}`;
        const thumbFilePath = `eventThumbnail/${thumbFileName}`

        // Uploading the thumbnail.
        await bucket.upload(tempFilePath, {destination: thumbFilePath,metadata: metadata})

        // Once the thumbnail has been uploaded delete the local file to free up disk space.
        fs.unlinkSync(tempFilePath)
        // [END thumbnailGeneration]


        // then save the thumbnail path to the event data in firestore database

        return Promise.resolve(null)



      }
      catch (error) {
          console.log(error)
      }




    });

как остановить функцию после успешного создания эскиза?

1 ответ

Решение

Вы пишете миниатюру обратно в хранилище:

const thumbFilePath = `eventThumbnail/${thumbFileName}`
await bucket.upload(tempFilePath, {destination: thumbFilePath,metadata: metadata})

Это снова запускает вашу функцию, но вы не проверяете правильно, нужно ли снова обрабатывать новый эскиз.

Это единственная проверка, которую вы выполняете сейчас для досрочного прекращения:

if (!contentType.startsWith('image/')) {
    console.log('This is not an image.');
    return null;
}

Что, очевидно, не работает в вашем случае. Может быть, вам следует проверить путь к новым файлам, а не к типу содержимого. Может быть, пропустить файлы, записанные в eventThumbnail будет работать для вашего случая.

Другие вопросы по тегам