Я нахожусь в процессе создания приложения для построения маршрутов на карте и сохранения их в базе данных 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 очень длинные.Будет ли лучший способ сохранить данные буфера и преобразовать их в закодированную строку перед отправкой обратно клиенту?Есть ли рекомендуемый способ работы с такими данными?Мне интересно слышать чужие мысли и подходы.