Node.js 实现带缓存功能的简易静态文件服务器
作者:栖木时间:2026-10-24 01:45:34浏览:139
本文介绍如何使用 Node.js 快速构建一个简易的静态文件服务器。通过结合 http、fs 和 mime 模块,实现文件读取与类型解析,并探讨开启浏览器缓存(Cache-Control/Expires)时的 304 响应及文件更新后的缓存刷新问题,帮助开发者在无需复杂框架的情况下部署轻量级服务。
Node.js 简易文件服务器实现
简易文件服务器
在某些场景下,若需访问服务器上的文件且希望避免编写复杂的程序,可以考虑使用 Node.js。借助其特性,能够非常便捷地搭建一个文件服务器。
以下提供一个带有缓存功能的简易文件服务器示例。该代码已托管于 GitHub,用户可直接复制运行,但需预先安装 mime 依赖包。
核心代码与配置解析
const port = 3004; // 端口号
const http = require('http');
const url = require('url');
const fs = require('fs');
const path = require('path');
const mime = require('mime');
const STATIC_FOLDER = 'public'; // 默认读取public文件夹下的文件
const IS_OPEN_CACHE = true; // 是否开启缓存功能
const CACHE_TIME = 10;// 告诉浏览器多少时间内可以不用请求服务器,单位:秒
const server = http.createServer((req, res) => {
const obj = url.parse(req.url); // 解析请求的url
let pathname = obj.pathname; // 请求的路径
if (pathname === '/') {
pathname = './index.html';
}
const realPath = path.join(__dirname, STATIC_FOLDER, pathname); // 获取物理路径
// 获取文件基本信息,包括大小,创建时间修改时间等信息
fs.stat(realPath, (err, stats) => {
let endFilePath = '', contentType = '';
if (err || stats.isDirectory()) {
// 报错了或者请求的路径是文件夹,则返回404
res.writeHead(404, 'not found', {
'Content-Type': 'text/plain'
});
res.write(`the request ${pathname} is not found`);
res.end();
} else {
let ext = path.extname(realPath).slice(1); // 获取文件拓展名
contentType = mime.getType(ext) || 'text/plain';
endFilePath = realPath;
if (!IS_OPEN_CACHE) {
// 未开启缓存
let raw = fs.createReadStream(endFilePath);
res.writeHead(200, 'ok');
raw.pipe(res);
} else {
// 获取文件最后修改时间,并把时间转换成世界时间字符串
let lastModified = stats.mtime.toUTCString();
const ifModifiedSince = 'if-modified-since';
// 告诉浏览器在规定的什么时间内可以不用请求服务器,直接使用浏览器缓存,不过貌似没有生效,需要再学习一下为什么
let expires = new Date();
expires.setTime(expires.getTime() + CACHE_TIME * 1000);
res.setHeader("Expires", expires.toUTCString());
res.setHeader('Cache-Control', 'max-age=' + CACHE_TIME);
if (req.headers[ifModifiedSince] && lastModified === req.headers[ifModifiedSince]) {
// 请求头里包含请求ifModifiedSince且文件没有修改,则返回304
res.writeHead(304, 'Not Modified');
res.end();
} else {
// 返回头Last-Modified为当前请求文件的最后修改时间
res.setHeader('Last-Modified', lastModified);
// 返回文件
let raw = fs.createReadStream(endFilePath);
res.writeHead(200, 'ok');
raw.pipe(res);
}
}
}
});
});
server.listen(port);
console.log(`server is running at http://localhost:${port}`)
缓存机制存在的问题
目前该实现仍存在部分待优化问题:虽然服务器能正确返回 304 状态码,且在修改文件后再次请求能返回最新内容,但在设置了 Cache-Control 和 Expires 头信息后,在规定的缓存有效期内浏览器仍会向服务器发起请求。这一现象的具体原因尚需进一步排查,若有了解相关机制的开发者,欢迎提供建议。
以上内容为本文的全部分享,旨在为读者的学习提供一定参考,同时也欢迎大家继续支持本站。
作者最新文章
NestJS 是什么?与 Express、Koa 的核心区别及选型建议
2026-11-05 13:46:41
生产环境升级 Node.js 的注意事项与兼容性测试策略
2026-11-05 09:19:24
nvm 常用命令详解:怎么平滑切换和升级 Node.js 版本
2026-11-04 09:02:34
JavaScript和JSP的根本区别:运行环境与执行机制解析
2026-11-03 23:30:18
使用nvm卸载指定版本Node.js并切换默认环境
2026-11-03 23:09:26
