#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:
Проблема в том, что для облачного запуска нет встроенного механизма хранения, файлы могут быть только временно сохранены для обработки в экземпляре контейнера, но это означает, что вы не можете «развернуть» файл вместе с вашим приложением для обработки.
Для постоянного хранилища вам потребуется интегрировать ваше приложение с облачным хранилищем.