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

时间:2017-11-07 20:16:03

标签: javascript node.js 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);
        });
    });

注意**我只想知道如何使用内部Node JS模块(无快递)

3 个答案:

答案 0 :(得分:1)

您不应该使用fs.exists()弃用;相反,如果您只想检查存在,请使用fs.stat()。如果要在检查存在后打开并读取文件,则只需使用fs.readFile()并相应地处理传递的错误以查找不存在的文件。这在fs的{​​{1}}文档中有所说明,但仍适用于fs.access()。以下是Node.js文档的摘录。

  

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

fs.stat()不会对您进行任何缓存,这是您自己需要创建/管理的内容。下面的示例演示如何使用JS Object作为字典创建文件缓存,以保持文件内容索引的文件内容。重要的是要注意,你不应该在fs.readFile()对象中放置数据,相反,这对许多较小的文件都有好处。

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

getFileFromCache()

答案 1 :(得分:0)

如果要跨多个模块访问文件数据,可以将文件数据存储在变量或全局变量中(使用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.exists(我通常使用fs.access),因为不推荐使用exists方法。
https://nodejs.org/api/fs.html#fs_fs_stat_path_callback
https://nodejs.org/api/fs.html#fs_fs_access_path_mode_callback

快乐的编码!

答案 2 :(得分:0)

  

第一次阅读后,fs.readFile()会将文件内容缓存在服务器的内存中吗?

没有。 fs.readFile()本身没有缓存。

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

如果您想自己确保缓存,那么您应该在第一次阅读后自己存储内容,然后再使用以前阅读的内容。