Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用nodejs express响应浏览器可以缓存的现有图像文件?_Node.js_Image_Express_Browser Cache - Fatal编程技术网

Node.js 使用nodejs express响应浏览器可以缓存的现有图像文件?

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函数检查现有图像,如果存在,则返回现有图像内容;如果不存在,则返回现有图像内容,执行一些图像处理任务,然后返回结果图像

我有一个用nodejs和express(以及其他东西)构建的小webapp,它有一个动态调整图像大小的路径(使用)。路线如下所示:

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以外的任何内容设置的过期值。我猜这需要单独设置,不像缓存控制可以全局设置。