Node.js 使用nodejs express响应浏览器可以缓存的现有图像文件?
我有一个用nodejs和express(以及其他东西)构建的小webapp,它有一个动态调整图像大小的路径(使用)。路线如下所示:Node.js 使用nodejs express响应浏览器可以缓存的现有图像文件?,node.js,image,express,browser-cache,Node.js,Image,Express,Browser Cache,我有一个用nodejs和express(以及其他东西)构建的小webapp,它有一个动态调整图像大小的路径(使用)。路线如下所示: router.get('/image/:options/:basedir/:dir/:img', utilitiesController.getOptimizedImage); 在utilities控制器中,我使用getOptimizedImage函数检查现有图像,如果存在,则返回现有图像内容;如果不存在,则返回现有图像内容,执行一些图像处理任务,然后返回结果图像
router.get('/image/:options/:basedir/:dir/:img', utilitiesController.getOptimizedImage);
在utilities控制器中,我使用getOptimizedImage函数检查现有图像,如果存在,则返回现有图像内容;如果不存在,则返回现有图像内容,执行一些图像处理任务,然后返回结果图像
exports.getOptimizedImage = async (req, res) => {
// Parse options from request...
// first, check to see if resized version exists
fs.readFile(processedImgPath, function (err, processedImg) {
if (err) {
//console.log('File does not yet exist.');
// If resized version doesn't exist, check for original
fs.readFile(originImgPath, function (err, originImg) {
if (err) {
// If origin image doesn't exist, return 400.
} else if (w || h) {
// If origin image does exist, process it...
// Once it's processed, return the processed image
res.end(newImg);
return;
}
}
} else {
//
res.end(processedImg);
//res.redirect(existingFileUrl);
return;
}
}
}
这个代码有效。我可以这样要求:
<img src="http://example.com/image/w800/foo/bar/imagename.jpg">
…并按预期返回调整大小的图像。问题似乎在于,由于使用res.end()返回图像的方式,浏览器缓存(在Chrome中测试)从不存储图像,因此重新加载页面会下载新图像,而不是从内存或磁盘加载
我也可以使用res.redirect()发回现有已处理图像文件的url,该文件将在刷新时缓存,但这样做感觉是错误的,因为它最终会使用图像处理路径将所有图像请求加倍
我不想在请求之前处理图像;我特别希望只在第一次请求图像时处理它们,然后存储一个处理过的版本,以便每次连续引用。我对这些限制条件下的替代方案持开放态度,但希望有人能解释我如何在当前结构中利用浏览器缓存?您应该在任何
res.end
之前添加用于缓存的http头,下面的示例将过期时间设置为1天(86400000ms)
res.set({
“缓存控制”:“公共,最大年龄=86400”,
“过期”:新日期(Date.now()+86400000).toutString()
})
您应该在任何res.end
之前添加用于缓存的http头,下面的示例将过期时间设置为1天(86400000毫秒)
res.set({
“缓存控制”:“公共,最大年龄=86400”,
“过期”:新日期(Date.now()+86400000).toutString()
})
这一点在你说了之后就很明显了,但让我感到不快的是,我已经为提供图像的目录全局设置了maxAge选项:app.use(express.static(path.join(u dirname,'public'),{maxAge:86400000})代码>这是使用res.end()和res.render()的区别吗?我的其他资产按预期缓存。res.end
不设置缓存,只刷新响应res.render
默认情况下管理模板并设置缓存头(我不知道过期值)Express文档似乎没有说明为Cookie以外的任何内容设置的过期值。我猜这需要单独设置,不像缓存控件可以全局设置。这一点在你说了之后很明显,但让我感到不舒服的是,我已经为提供图像的目录全局设置了maxAge选项:app.use(express.static(path.join(u dirname,'public'),{maxAge:86400000}));代码>这是使用res.end()和res.render()的区别吗?我的其他资产按预期缓存。res.end
不设置缓存,只刷新响应res.render
默认情况下管理模板并设置缓存头(我不知道过期值)Express文档似乎没有说明为Cookie以外的任何内容设置的过期值。我猜这需要单独设置,不像缓存控制可以全局设置。