Обслуживание динамически генерируемого изображения или сохраненного изображения с помощью Express

1

Я создал приложение для доставки изображений, которое может обслуживать изображения и изменять размер/изменять расширение изображения по запросу.

Я использую Express для маршрутизации и Sharp для работы с изображениями.

Когда изображение запрашивается с новым размером/расширением, я хочу сохранить сгенерированное изображение в файловой системе и получить сохраненное изображение при следующем запросе того же изображения с теми же параметрами (вид кеша).

Все, что я построил, отлично работает, но в производстве потребление процессора велико. Я подозреваю, что это потому, что я возвращаю изображение с res.sendFile() после сохранения его в файловой системе.

В настоящий момент мой рабочий процесс:

  • Я проверяю файловую систему, если изображение уже сохранено с требуемыми параметрами (fs.access())
  • Если он существует, я res.sendFile путь локального изображения
  • Если он не существует, я генерирую его с помощью Sharp, я сохраняю его в файловой системе, и я res.sendFile сгенерированный путь к изображению

Я читаю, res.sendFile не использует системный вызов sendfile и тяжелый CPU.

Как я могу его заменить?

Вот что я нашел при поиске в Google:

  • Когда я res.send() новое изображение, я могу res.send() буфер, созданный Sharp, вместо res.sendFile сохраненное изображение
  • Если изображение уже сохранено, возможно, я должен использовать статическое промежуточное ПО (http://expressjs.com/en/starter/static-files.html), но я не знаю, как я могу динамически его вызвать и сказать путь изображения (на основе параметров, указанных в URL-адресе запроса).
Теги:
express
sharp

1 ответ

1
Лучший ответ

Использование static промежуточного программного обеспечения, к сожалению, даст одни и те же характеристики производительности, поскольку он использует те же методы под капотом, что и res.sendFile. Кажется, что вы хотите сделать, чтобы обслуживать изображения из Nginx или smilar обратного прокси, запущенного перед вашим приложением.

Это можно сделать несколькими способами. Проще всего, вероятно, отправить перенаправления из вашего приложения Node.js, которое указывает на местоположение, которое будет обслуживать обратный прокси.

В основном, когда запрашивается запрос /imageID/toto.jpg?quality=80, вы хотите перенаправить его в /static-images/imageID_80.jpg.

// ...

const imageName = ${req.params.imageId}_${req.query.quality}.jpg

if (!(await pathExists(imageName)) {
  await generateFileUsingSharp(req.params.imageId, req.query.quality)
}

res.redirect('/static-images/${imageName}')

Тогда вы должны позволить Nginx обслуживать файлы в каталоге /static-images:

location /static-images {
  alias /var/www/generated-images;
}
  • 0
    Большое спасибо, мне кажется, это хороший вариант (мне даже не пришлось просить примеры кода, это очень ясно). Еще один маленький вопрос поверх этого: в настоящее время я использую fs.access, чтобы увидеть, существует ли путь. Я видел некоторые использования fs.stats, что, по вашему мнению, было бы наиболее эффективным?
  • 1
    Я предполагаю, что fs.access быстрее, поскольку он не возвращает всю (в данном случае) несвязанную информацию. Я лично использую path-exists ( github.com/sindresorhus/path-exists ), который использует fs.access , но возвращает Promise

Ещё вопросы

Сообщество Overcoder
Наверх
Меню