javascript - 使用 Express 提供动态生成的图像或保存的图像

标签 javascript express sharp

我构建了一个图像传送应用程序,可以提供图像并按需调整大小/更改图像扩展。

我使用 Express 进行路由,使用 Sharp 处理图像。

当请求具有新尺寸/扩展名的图像时,我想将生成的图像保存在文件系统中,并在下次使用相同参数请求相同图像时检索保存的图像(某种缓存)。

我构建的一切都运行良好,但在生产中 CPU 使用率很高。我怀疑这是因为我在将图像保存到文件系统后用 res.sendFile() 返回了图像。

目前这是我的工作流程:

  • 我检查文件系统是否已使用所需参数 (fs.access()) 保存图像
  • 如果存在,我res.sendFile本 map 片路径
  • 如果不存在,我会使用 Sharp 生成它,将其保存在文件系统中,然后res.sendFile生成的图像路径

我读到 res.sendFile 不使用系统 sendfile 调用,而且占用大量 CPU。

如何替换它?

这是我在谷歌搜索时发现的:

  • 当我生成新图像时,我可以res.send() Sharp 生成的缓冲区而不是res.sendFile 保存的图像
  • 当图像已经保存时,也许我应该使用静态 express 中间件 ( http://expressjs.com/en/starter/static-files.html ) 但我不知道如何动态调用它并告诉它图像路径(基于请求中提供的参数网址)。

最佳答案

不幸的是,使用 static 中间件会产生相同的性能特征,因为它在后台使用与 res.sendFile 相同的方法。看起来您想要做的是从 Nginx 或在您的应用程序前面运行的类似反向代理提供图像。

有几种方法可以实现这一点。最简单的方法可能是从您的 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;
}

关于javascript - 使用 Express 提供动态生成的图像或保存的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46324479/

相关文章:

javascript - Browserify——避免输出绝对路径

javascript - 如何在指令中设置 ng-disabled

javascript - 尝试使用expressJS重定向时出现"blocked by CORS policy"

javascript - 为什么错误处理在 nodemailer 中不起作用?

node.js - Express 4、NodeJS、AngularJS 路由

sharp - 如何通过 pnpm 在 AWS Lambda 上使用 Sharp?

javascript - 我怎样才能让我的javascript代码添加总金额

javascript - 是否有纯 CSS(无 JavaScript)解决方案来使可变内容适合垂直网格?

javascript - 为什么夏普输出相同的文件,即使我改变了输入文件?

javascript - 如何使用 Sharp.js 将图像从缓冲区存储到 Node.js 中的文件系统