Создание файла и сохранение в переменную NodeJS - PullRequest
0 голосов
/ 03 июля 2018

Я использую Puppeteer для сканирования сайта. Моя цель - иметь возможность отправить снимок экрана и HTML-файл в ответ.

Мой код покажет мой маршрут, получая URL в качестве параметра, передавая его в мою функцию сканирования, выполняя правильное действие через Puppeteer и возвращая снимок экрана и (в настоящее время) html в виде строки. Мне нужно превратить эту HTML-строку в файл HTML, не сохраняя его, только в памяти.

файл маршрута:

const crawler = require('./../puppeteer/crawler.js');


module.exports = function(app) {
  app.get('/crawl/screenshot/:url', (req, res) => {
    const url = req.params.url;
    crawler.pageScreenshot(url, function(screenshot) {
      let buffer = new Buffer(screenshot);
      let myScreenshot = buffer.toString('base64');
      // res.contentType('image/png');
      res.send(myScreenshot);
    });
  });
  app.get('/crawl/html/:url', (req, res) => {
    const url = req.params.url;
    crawler.pageHTML(url, function(html) {
      console.log(typeof html);
      let buffer = Buffer.from(html).toString('base64');
      // res.contentType('text/html');
      res.send(buffer);
    });
  });
  app.get('/crawl/screenshot_and_html/:url', (req, res) => {
    const url = req.params.url;
    crawler.pageScreenshotAndHTML(url, function(screenshot,html) {
      let buffedScreen = Buffer.from(screenshot).toString('base64');
      let buffedHtml = Buffer.from(html).toString('base64');
      let obj = JSON.stringify({'screenshot': buffedScreen, 'html': buffedHtml});
      res.contentType('application/json');
      res.send(obj);
    });
  });
};

Файл сканера:

const puppeteer = require('puppeteer');

async function pageScreenshot(url, cb) {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(url);
  let screenshot = await page.screenshot({fullPage: true});
  await browser.close();
  cb(screenshot);
}
async function pageHTML(url, cb) {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(url);
  let html = await page.content();
  await browser.close();
  cb(html);
}
async function pageScreenshotAndHTML(url,cb) {
  // this encoding doesn't work
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(url);
  let screenshot = await page.screenshot({fullPage: true});
  let html = await page.content();
  await browser.close();
  cb(screenshot,html);
}
module.exports = {
  pageScreenshot: pageScreenshot,
  pageHTML: pageHTML,
  pageScreenshotAndHTML: pageScreenshotAndHTML
}

Опять же, моя переменная html (в моем файле сканера) в настоящее время является строкой html. Мне нужно, чтобы эта переменная была HTML-файлом с HTML, который я получаю от кукловода, а не просто строкой. Я хотел бы сделать это без локального сохранения / записи в файл, а затем удалить его.

Спасибо!

1 Ответ

0 голосов
/ 05 июля 2018

Моя первоначальная идея и проблема заключалась в том, что я хотел отправить обратно 2 элемента - закодированный файл png и закодированный файл html. В конечном итоге это будет получено другим приложением. Затем при декодировании я думал, что они будут декодировать в файлы, которые были в приложении Node выше, перед кодированием. Однако теперь я вижу, что даже отправляя png назад, принимающее приложение все равно должно переводить изображение из строкового формата. Таким образом, моя первоначальная мысль и проблема больше не действительны, потому что в принимающем приложении я должен был позаботиться о переводе того, что получил, независимо от того, как оно было отправлено. Мой код остался прежним, он отвечает png в кодировке base64 и строка (из html). Я позабочусь о том, чтобы перевести их из формата декодированной строки base64 в соответствующий формат (в данном случае PNG и HTML) в приложении, которое выполняет вызов. Извините за путаницу!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...