fs.readFile()会在第一次读取之后caching服务器内存中的文件内容吗?

我想知道下面的代码是否会在读取一次后将文件的内容caching在服务器的内存中。 我问的原因是因为我不想每次用户请求页面时都要重新读取文件。 我宁愿在第一次读取之后caching它。

fs.exists(fileName, function (exists) { if (!exists) { console.log("== 404 error"); resp.writeHead(404, {'Content-Type': 'text/html'}); resp.end(pageError); return; } fs.readFile(fileName, 'utf8', function (err, data) { if (err) { resp.writeHead(404, {"Content-Type": "text/html"}); resp.end(pageError); return; } var contentType = getContentType(req.url); var mimeType = mimeTypes[contentType]; resp.writeHead(200, {"Content-Type": mimeType}); resp.end(data); }); }); 

注意**我只想知道如何使用内部节点JS模块(没有明确expression)

你不应该使用fs.exists()作为它的弃用; 如果你只想检查是否存在,请使用fs.stat() 。 如果打算在检查存在之后打开并读取文件,那么只需使用fs.readFile()并相应地处理传递的错误,以查找不存在的文件。 这在fs.access()fs文档中有fs.access()但是仍然适用于fs.stat() 。 以下是Node.js文档的摘录。

在调用fs.open()之前使用fs.access()检查文件的可访问性,不build议使用fs.readFile()或fs.writeFile()。 这样做会引入争用条件,因为其他进程可能会更改两个调用之间的文件状态。 相反,用户代码应直接打开/读取/写入文件,并处理文件不可访问时引发的错误。

fs.readFile()不会为你做任何caching,这是你需要创build/pipe理自己的东西。 下面的例子展示了如何使用JS对象作为字典来创build文件caching,以保持文件内容的索引。 重要的是要注意,你不应该在fileCache对象中放入数据,相反,这对很多较小的文件来说都是好的。

fileCache只需要在getFileFromCache()范围内,并且在运行时不会被垃圾收集的地方。

 const fileCache = {} const getFileFromCache = (filename, cb) => { if (fileCache[filename]) { return cb(null, fileCache[filename]) } fs.readFile(filename, 'utf8', (err, data) => { if (err) { return cb(err) } fileCache[filename] = data return cb(null, data) }) } 

fs.readFile()会在第一次读取之后caching服务器内存中的文件内容吗?

fs.readFile()本身没有caching。

但是,底层的操作系统将会进行文件caching,只要没有太多的其他文件活动,caching的读取就会被刷新,那么操作系统可能会从本地内存caching中获取文件第二,第三你读它。

如果你想确保caching自己,那么你应该只是自己存储的内容,一旦你第一次阅读,从那时起,你可以只使用以前阅读的内容。

如果要跨多个模块访问,可以将文件数据存储在variables或全局variables中(通过使用global.<varname> = <filedata>variables名global.<varname> = <filedata> )。

当然,正如George Cambpell所说,对文件的修改不会被程序注意到,因为它不会重新读取文件。

所以我会做这样的事情:

 function sendResponse(data) { let contentType = getContentType(req.url); let mimeType = mimeTypes[contentType]; resp.writeHead(200, {"Content-Type": mimeType}); resp.end(data); } if(global.fileData) { return sendResponse(global.fileData); } fs.readFile(fileName, 'utf8', function (err, data) { if (err) { resp.writeHead(404, {"Content-Type": "text/html"}); resp.end(pageError); return; } global.fileData = data; sendResponse(global.fileData); }); 

第一次global.fileData将是空的,所以你将继续fs.readfile,将文件内容存储在global.fileData中,并发送响应。
第二次global.fileData将包含的东西,所以你只是发送的东西的响应,你不会再读取文件。
有关进一步参考,请查看官方的NodeJS文档: https : //nodejs.org/api/globals.html#globals_global

你应该做的另一件事是用fs.access或fs.stat(我通常使用fs.access)replacefs.exists,因为不build议使用exists方法。
https://nodejs.org/api/fs.html#fs_fs_stat_path_callback
https://nodejs.org/api/fs.html#fs_fs_access_path_mode_callback

快乐的编码!