Каков рекомендуемый способ сохранения данных изображения со скриншота кукловода? - PullRequest
0 голосов
/ 21 июня 2019

Я нахожусь в процессе создания приложения для построения маршрутов на карте и сохранения их в базе данных mongodb.

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

Промежуточное ПО для всегопроцесс выглядит следующим образом:

exports.screenshotMap = async (req, res, next) => {
  try {
    const { lineFeatures } = req.body;
    const browser = await puppeteer.launch({
      args: ['--no-sandbox', '--disable-setuid-sandbox'],
    });

    // open new browser
    const page = await browser.newPage();

    // create array of coordinates from geojson features
    const coords = lineFeatures.map(line => line.geometry.coordinates);
    // reduce to 2D array of [lat, lon] coords
    const flattenedCoords = coords.reduce((accum, arr) => {
      return accum.concat(arr);
    }, []);
    // Stringify coords before using them as query string
    const coordsStr = JSON.stringify(flattenedCoords);

    // goto page with map sending coordintaes along
    await page.goto(`http://localhost:3000/test?coords=${coordsStr}`, {
      waitUntil: 'networkidle0',
    });

    // wait for map to load, call onLoad callback, and set state to make the h1 visible
   await page.waitForSelector('h1');
    // wait one more second to make sure all tiles for the map are loaded. Longer routes can require significantly more tiles
    await page.waitFor(1000);

    const image = await page.screenshot({
      type: 'jpeg',
      quality: 100,
      clip: {
        x: 0,
        y: 70,
        width: 640,
        height: 360,
      },
      omitBackground: true,
    });

    await browser.close();
    // convert buffer to base64 string
    const base64Image = await image.toString('base64');
    // attach to request object to be used in the next middleware
    req.image = base64Image;
    next();

  } catch (err) {
    res.status(400).send(err);
  }
};

Этот подход работает, однако мне интересно, есть ли лучший способ.Я прочитал, что хранение данных буфера лучше для памяти базы данных, так как строки base64 очень длинные.Будет ли лучший способ сохранить данные буфера и преобразовать их в закодированную строку перед отправкой обратно клиенту?Есть ли рекомендуемый способ работы с такими данными?Мне интересно слышать чужие мысли и подходы.

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