Облачный запуск — прикрепить сжатый файл к ответу

#node.js #asynchronous #puppeteer #google-cloud-run

# #node.js #асинхронный #кукловод #google-облачный запуск

Вопрос:

Я запускаю тестовую среду облачного запуска Google, используя пакет functions-framework на узле. В настоящее время я пытаюсь прикрепить zip-файл к своему ответу с помощью .скачать, но я не верю, что файл существует в экземпляре test cloud, пока он находится в моих файлах? Извините, я действительно не слишком хорошо знаком с тем, что происходит.

tldr: я пытаюсь запросить загрузку zip-файла, содержащего все изображения на сайте, но у меня возникли проблемы с прикреплением zip-файла к ответу

index.js

 const puppeteer = require("puppeteer");
const archiver = require("archiver");
const fs = require("fs");

exports.screenshot = async (req, res) => {
  var output = fs.createWriteStream("./example.zip");
  var archive = archiver("zip");

  archive.on("error", function (err) {
    throw err;
  });

  archive.pipe(output);

  let browserPromise = puppeteer.launch({
    args: ["--no-sandbox"],
  });

  const url = req.query.url || "http://example.org";

  const browser = await browserPromise;
  const context = await browser.createIncognitoBrowserContext();
  const page = await context.newPage();

  await page.setViewport({ width: 3840, height: 2160 });
  await page.goto(url);

  const images = await page.evaluate(() =>
    Array.from(document.getElementsByTagName("img"), (e) => [
      e.x,
      e.y,
      e.width,
      e.height,
    ])
  );
 count = 0;
  await asyncForEach(images, async (image) => {
    count  ;
    await page.evaluate(
      (y) => document.scrollingElement.scrollTo(0, y),
      image[1]
    );
    await page.screenshot({
      path: `image.png`,
      clip: {
        x: image[0],
        y: image[1],
        width: image[2],
        height: image[3],
      },
    });
    if (count < 10) {
      archive.file("./image.png", { name: `0${count}.png` });
    } else {
      archive.file("./image.png", { name: `${count}.png` });
    }
  });

  archive.finalize();
  //res.setHeader("Content-Type", "image/png");
  // res.set("Content-Type", "application/zip");
  // res.set("Content-Disposition", "attachment; filename="   "example.zip");
  // res.download("/example.zip", "result.zip");
  // res.send("example.zip");

  context.close();
};

async function asyncForEach(array, callback) {
  for (let index = 0; index < array.length; index  ) {
    await callback(array[index], index, array);
  }
}
 

package.json

 "scripts": {
    "start": "functions-framework --target=screenshot"
  },
"dependencies": {
    "@google-cloud/functions-framework": "^1.7.1",
    "archiver": "^5.1.0",
    "fs": "0.0.1-security",
    "puppeteer": "^5.5.0"
  }
 

Ответ №1:

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

Для постоянного хранилища вам потребуется интегрировать ваше приложение с облачным хранилищем.