Node.js 实战静态文件服务器示例代码详解 在本篇文章中,我们将详细介绍如何使用 Node.js 创建一个静态文件服务器,实现读取静态文件、访问目录、MIME 类型支持、缓存支持、gzip 压缩、Range 支持、断点续传、全局命令执行和子进程运行等功能。 一、创建服务器 我们需要引入 http 模块,创建一个服务器,并监听配置端口: ```javascript const http = require('http'); const server = http.createServer(); server.on('request', request.bind(this)); server.listen(config.port, () => { console.log(`静态文件服务启动成功, 访问localhost:${config.port}`); }); ``` 二、请求处理函数 我们需要写一个专门处理请求的函数,返回静态文件。我们使用 url 模块来获取路径: ```javascript const url = require('url'); const fs = require('fs'); function request(req, res) { const { pathname } = url.parse(req.url); // 访问路径 const filepath = path.join(config.root, pathname); // 文件路径 fs.createReadStream(filepath).pipe(res); // 读取文件,并响应 } ``` 三、支持寻找 index.html 如果用户访问根目录,我们需要寻找 index.html 文件: ```javascript if (pathname === '/') { const rootPath = path.join(config.root, 'index.html'); try { const indexStat = fs.statSync(rootPath); if (indexStat) { filepath = rootPath; } } catch (e) {} } ``` 四、访问目录时,列出文件目录 如果用户访问目录,我们需要列出文件目录: ```javascript fs.stat(filepath, (err, stats) => { if (err) { res.end('not found'); return; } if (stats.isDirectory()) { let files = fs.readdirSync(filepath); files = files.map(file => ({ name: file, url: path.join(pathname, file) })); let html = this.list()({ title: pathname, files }); res.setHeader('Content-Type', 'text/html'); res.end(html); } }); ``` 五、HTML 模板 我们使用 Handlebars 模板引擎来生成 HTML 内容: ```javascript function list() { let tmpl = fs.readFileSync(path.resolve(__dirname, 'template', 'list.html'), 'utf8'); return handlebars.compile(tmpl); } ``` 六、MIME 类型支持 我们使用 mime 模块来获取文件类型,并设置编码: ```javascript res.setHeader('Content-Type', mime.getType(filepath) + ';charset=utf-8'); ``` 七、缓存支持 我们使用 http 协议缓存来实现缓存支持: ```javascript res.setHeader('Cache-Control', 'max-age=3600'); ``` 八、gzip 压缩 我们使用 zlib 模块来实现 gzip 压缩: ```javascript const zlib = require('zlib'); res.writeHead(200, { 'Content-Encoding': 'gzip' }); fs.createReadStream(filepath).pipe(zlib.createGzip()).pipe(res); ``` 九、Range 支持 我们使用 http 模块来实现 Range 支持: ```javascript if (req.headers.range) { const range = req.headers.range; const start = parseInt(range.replace(/bytes=/, ''), 10); const end = filepath.length; const chunksize = (end - start); res.writeHead(206, { 'Content-Range': `bytes ${start}-${end}/${filepath.length}`, 'Content-Length': chunksize, 'Content-Type': mime.getType(filepath) }); fs.createReadStream(filepath, { start, end }).pipe(res); } ``` 十、断点续传 我们使用 http 模块来实现断点续传: ```javascript if (req.headers['if-range']) { const etag = req.headers['if-range']; const lastModified = fs.statSync(filepath).mtime; if (etag === lastModified) { res.writeHead(304, { 'Content-Type': 'text/plain' }); res.end(); } } ``` 十一、全局命令执行 我们使用 child_process 模块来实现全局命令执行: ```javascript const childProcess = require('child_process'); childProcess.exec('ls -l', (err, stdout, stderr) => { console.log(stdout); }); ``` 十二、子进程运行 我们使用 child_process 模块来实现子进程运行: ```javascript const childProcess = require('child_process'); const child = childProcess.fork('child.js'); child.on('message', (msg) => { console.log(msg); }); ``` 我们已经实现了一个功能齐全的静态文件服务器,支持读取静态文件、访问目录、MIME 类型支持、缓存支持、gzip 压缩、Range 支持、断点续传、全局命令执行和子进程运行等功能。
- 粉丝: 6
- 资源: 888
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Bluefield 2固件镜像版本,fw-MBF2M345A-VENOT-ES-Ax-24.40.1000.bin
- 雪颜奇迹幻白双重莹白焕采霜50ML-1016-FA.rar
- Qt的QDOCK高级用法源码,包含linux和windows版本,从开源库下载
- OC-FileManage
- coredns-v1.10.1.tar、flannel-v0.26.1.tar、flannel-cni-plugin-v1.5.1-flannel2.tar
- 美宝莲双头眉笔Bundle pack 卸妆液 1211FA-1.rar
- 数学建模学习资料 蒙特卡罗算法课件教程 共9个章节.rar
- 20150424美宝莲胶笔宝贝描述改790.rar
- 《图像梯度与常见算子全解析:原理、用法及效果展示》
- 实验5 GDB调试器的使用(2).docx