如何在内存中缓存使用express.static提供的文件?

时间:2017-03-08 10:26:28

标签: node.js express caching server-side

根据this question express.static每次都从硬盘驱动器中读取文件。我想将服务文件缓存在内存中,因为它们不会改变,没有很多,我有足够的内存来执行此操作。

所以对于像这样的代码:

null

如何确保通过express.static和res.sendFile在内存中提供快速缓存文件?

3 个答案:

答案 0 :(得分:1)

简短的回答是,你不能,至少不是express.static()。您需要使用第三方模块或编写自己的模块。此外,您可以在相应的问题跟踪器上打开功能请求问题,要求使用某种钩子拦截调用以从磁盘读取请求的文件。

答案 1 :(得分:1)

这通常不值得,因为操作系统会为您处理这个问题。

所有现代操作系统都将使用未使用的RAM作为"buffer cache" or "page cache"。最近使用的文件系统数据将存储在RAM中,因此一旦文件被加载到内存中,任何后续读取都将从内存中提供,而不是实际从磁盘读取。

依赖于此的优势在于,当流程中的内存消耗量增加时,操作系统将自动从缓冲区缓存中清除数据,从而不会冒这些进程内存不足的风险(因为您可能拥有当你在用户空间中实现某些东西时。)

答案 2 :(得分:0)

一种方法是在 Node 启动时读取 HTML 文件并从变量提供 HTML 字符串。这是一个使用 Express 的示例。将 MY_DIST_FOLDER 替换为您的文件夹位置。

//using Express
const fs = require('fs');
const express = require('express');
const app = express();

//get page HTML string
function getAppHtml() {
  let html = '';
  try {
    html = fs.readFileSync(`${MY_DIST_FOLDER}/index.html`, 'utf8');
  } catch (err) {
    console.error(err);
  }

  return html;
}

let html = getAppHtml();

//serve dist folder catching all other urls
app.get(/.*/, (req, res) => {
  if (html) {
    res.writeHead(200, {'Content-Type': 'text/html','Content-Length':html.length});
  } else {
    html = "Node server couldn't find the index.html file. Check to see if you have built the dist folder.";
    res.writeHead(500, {'Content-Type': 'text/html','Content-Length':html.length});
  }
  res.write(html);
  res.end();
});