如何缓存通过Ajax-JavaScript(NodeJS)加载的文件

如何缓存通过Ajax-JavaScript(NodeJS)加载的文件,javascript,node.js,caching,proxy,filestream,Javascript,Node.js,Caching,Proxy,Filestream,我正在开发一个应用程序,通过node js中的https.get()加载pdf文件,将数据分块发送到前端。它工作得很好,我这样做的原因是我有时从远程服务器加载pdf,这会导致CORS问题,所以我编写了一个简单的代理来处理它。它工作得很好,但问题是,每次我从前端发出请求时,pdf都会被重新加载,每次加载时都会被重新加载。我想做的是,当第一次加载pdf文件时,我应该将其缓存在前端或后端,然后在每次刷新页面时从缓存中加载 在前端读取文件流 consturl=”http://localhost:80

我正在开发一个应用程序,通过
node js
中的
https.get()
加载pdf文件,将数据分块发送到前端。它工作得很好,我这样做的原因是我有时从远程服务器加载pdf,这会导致CORS问题,所以我编写了一个简单的代理来处理它。它工作得很好,但问题是,每次我从前端发出请求时,pdf都会被重新加载,每次加载时都会被重新加载。我想做的是,当第一次加载pdf文件时,我应该将其缓存在前端或后端,然后在每次刷新页面时从缓存中加载

在前端读取文件流

consturl=”http://localhost:8003/pdf-cors”;
常量文件=”https://veraviafit.com/wp-content/uploads/2018/11/N2RPlan-3-1.pdf";
获取(`${url}?文件=${file}`)。然后(异步(响应)=>{
const reader=response!.body!.getReader();
const stream=新的ReadableStream({
启动(控制器){
//下面的函数处理每个数据块
函数push(){
//“done”是一个布尔值,是一个“Uint8Array”
reader.read()。然后((r)=>{
//控制台日志(r);
常数{
完成,
价值
}=r;
log(“VALUE-->”,VALUE);
//没有更多的数据可读取吗?
如果(完成){
//告诉浏览器我们已完成数据发送
controller.close();
返回;
}
//console.log(值);
//获取数据并通过控制器将其发送到浏览器
控制器排队(值);
推();
});
};
推();
}
});
返回新的响应(流{
标题:{
“内容类型”:“文本/html”
}
});

});从lodash中查看memoize函数。如果不想包含lodash,您可以自己轻松实现这样的函数


我找到了一个可行的解决方案,完全缩短了加载时间。因此,第一次加载pdf需要
2.5
分钟(具体取决于互联网速度),第二次重新加载pdf时,只需
54
秒即可加载缓存的pdf,我所要做的就是设置响应缓存头,这将实际缓存加载的数据。你可以去看看它是怎么工作的,我把它设置成这样


为了加载缓存动态文件,我让文件第一次加载并用指定的缓存“键”保存它,然后将整个块写入该文件。加载文件后,当我重新加载页面并对同一文件发出请求时,我将从该文件发回数据,而不是在每次调用时加载外部资源。它以毫秒为单位加载文件。

我知道有记忆功能,但是如果文件的速度超过100 MB,那会像预期的那样工作吗?我稍微误读了你的问题,很抱歉回答得太简短了。您需要将文件存储在服务器上,这样就不必每次都从外部源重新蚀刻它们。记下所请求的url有助于确定它是否是一个新文件,或者该文件以前是否被请求过。是的,在这种情况下这会很有用,但是我们如何在服务器端做到这一点呢?