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币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 使用 HTML 和 CSS 实现绚丽的节日烟花效果
- html/css/javascript实现简单的圣诞快乐demo
- 全志V3s GPIO驱动示例(传统设备驱动模型、平台总线设备驱动模型、设备树驱动模型)
- 基于pytho的turtle库实现的圣诞快乐demo
- 【深度学习系列专栏】ch01配套资源
- yolov4 - tiny 900张图片训练效果3
- 连接服务器的服务,可以电脑直连后获得服务器信息
- Vue.js 2.0 入门Demo文档步骤梳理
- 用JavaScript实现文字上下浮动效果
- 用python的turtle库实现新年快乐demo
- Parallels Desktop Activation Tool
- 用java是swing库实现新年快乐动效demo
- mingw资源包wenjian
- 华为汽车产品知识 外呼邀约需要注意什么
- LABVIEW程序实例-cp2_ex10.zip
- LABVIEW程序实例-chart接受的数据类型.zip