实现以下功能
  • 读取静态文件或目录
  • MIME类型支持
  • 缓存支持/控制
  • 支持gzip压缩
  • 访问目录可以自动寻找下面的index.html文件
  • Range支持,断点续传
  • 图片防盗链
  • 后台运行

基本功能读取静态文件

此功能分为两部分:

* 1、返回文件调用fs建立可读流读取文件返回客户端fs.createReadStream(filepath).pipe(res);* 2、返回目录因为是要返回当前请求路径下的所有目录,并且支持点击进入下一级,所有返回文件为html采用handlebars模板引擎编辑模板// 处理模板函数let list = function () {let template = fs.readFileSync(listTemplatePath, 'utf8');return handlebars.compile(template);}// template 文件<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>{{title}}</title></head><body><ul>{{#each files}}<li><a href={{url}}>{{name}}</a></li>{{/each}}</ul></body></html>// 读取当前路径下的所有目录let { promisify, inspect } = util;// 转变fs.readdir 异步方法返回promiselet readdirPromise = promisify(fs.readdir);// 返回filepath下所有目录let files = await readdirPromise(filepath)// 处理files为我们想要的数据files = files.map(file => ({name: file,url: path.join(pathname, file),}))// 最终返回客户端的html// listlet html = this.list({title: pathname,files,});

MIME类型支持

 res.setHeader('Content-Type', mime.getType(filepath));

缓存支持/控制

toCache (req, res, filepath, stat) {// 强制缓存res.setHeader('Cache-Control', 'private,max-age=60'); // http 1.1// private 客户端可以缓存// public 客户端和代理服务器都可以缓存// max-age=60 缓存内容将在60秒后失效// no-cache 需要使用对比缓存验证数据,强制向源服务器再次验证// no-store 所有内容都不会缓存,强制缓存和对比缓存都不会触发 res.setHeader('Expires', new Date(Date.now() + 60 * 1000).toUTCString()); // http 1.0// 对比缓存// last-modifylet ifModifiedSince = req.headers['if-modified-since'];let lastModified = stat.ctime.toGMTString();// etaglet ifNoneMatch = req.headers['if-none-match'];let eTag = cypto.createHash('sha1').update(stat.ctime.toGMTString() + stat.size).digest('hex');if (ifModifiedSince || ifNoneMatch) {if (ifNoneMatch === eTag && lastModified === ifModifiedSince) {res.statusCode = 304;res.end('');return false;}if ((ifModifiedSince && lastModified === ifModifiedSince) || (ifNoneMatch && ifNoneMatch === eTag)) {res.statusCode = 304;res.end('');return false;}}res.setHeader('Last-Modified', lastModified);res.setHeader('ETag', eTag);return true;}

压缩支持

async gzip(req, res, gzipInfo) {let encoding = req.headers['accept-encoding'];let gzipReg = /\bgzip\b/;let deflateReg = /\bdeflate\b/;let type, streamInfo;  if (gzipReg.test(encoding)) {streamInfo = gzipInfo ? await gzipPromise(gzipInfo) : zlib.createGzip();type = 'gzip';} else if (deflateReg.test(encoding)) {streamInfo = gzipInfo ? await deflatePromise(gzipInfo) : zlib.createDeflate();type = 'deflate';}if (type) {res.setHeader('Content-Encoding', type);}return streamInfo;}

访问目录可以自动寻找下面的index.html文件

let indexFilepath = path.join(filepath, '/', 'index.html');
try {let statIndex = await statPromise(indexFilepath);if (statIndex) {// 返回 inde.html文件return this.sendFile(req, res, indexFilepath, stat);}
} catch (e) {}

Range支持,断点续传

range (req, res, filepath, stat) {res.setHeader('Accept-Range', 'bytes'); // 通知客户端支持获取部分资源let range = req.headers['range']; // Range: bytes=0-xxxlet start = 0, end = stat.size;if (range) {let result = range.match(/bytes=(\d*)-(\d*)/);start = isNaN(result[1]) ? result[1] : start;end = isNaN(result[2]) ? result[2] : end;}return fs.createReadStream(filepath, {start,end,})}

图片防盗链

notSteal (req, res) {console.log(path.join(process.cwd(), 'imgs/load.png'))let refer = req.headers['referer'] || req.headers['refer'];//如果说有refer的话,则表示是从HTML页面中引用过来的if (refer) {let { host } = Url.parse(refer);if (host !== hostDomain) {// 返回默认图return fs.createReadStream(path.join(process.cwd(), 'imgs/load.png'));}}
}

开启子进程运行

let { spawn } =  require('child_process');
let fs = require('fs');let serverPath = '../src/child.js';
let child = spawn('node', [serverPath], {detached: true,stdio: ['ignore', process.stdout, 'ignore']
})child.unref();
  • 功能尚不完善,之后会慢慢丰富!
  • 更多细节源码请查看我的GitHub sevenStatic

参考

  • Node.js静态文件服务器实战

node静态服务器tudo相关推荐

  1. node静态服务器优缺点_使用 Node.js 的优势和劣势都有哪些?

    很多回答已经写的很全,补充(强调)一点--Node.js 中的容错性实在是很弱.当异步回调中出现异常,而相应的 error 的事件有没有被订阅(有时候根本不可能去订阅),那么整个进程都会挂掉.但尴尬的 ...

  2. 开源 静态 文件 服务器,Node.js搭建静态服务器

    写在开头,本文是node.js最最初级的搭建静态服务器,比较适合新手入门,大神请绕道哦- Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用 ...

  3. node 创建静态服务器并自动打开浏览器

    node 作为一门偏向后端的技术,提供了可以让我们js 在服务器上运行的平台,为我们前端工程师实现项目前端工程化,带来了众多便利.同时,它也可以很方便的创建静态服务器,可以直接连接数据库...实现多种 ...

  4. 完成静态服务器——Node.js摸石头系列之四

    系列目录:Node.js摸石头系列目录 一.一个错误引发的摸索 上回我们在获取 request 对象的 headers 属性的 'user-agent'  属性时,我使用了 request.heade ...

  5. node.js request get 请求怎么拿到返回的数据_从零开始用nodejs写一个简单的静态服务器

    nodejs搭建服务器第一步 const http = require("http")const PORT = 8000 const server = http.createSer ...

  6. 构建静态服务器_为静态网站构建无服务器联系表

    构建静态服务器 介绍 (Introduction) A few years ago AWS launched static hosting service S3, which was a paradi ...

  7. nodejs如何实现ajax,nodejs使用静态服务器处理ajax

    如需转载请注明来源与作者 上一次,手写了一个静态服务器.这次我们想更进一步:返回给前端ajax数据.注意:这里只是一个演示,所以所有ajax传入服务器的数据,我不会经过处理直接返回 文件夹 Tips ...

  8. svn服务器搭建和使用_简单使用nodejs搭建一个静态服务器

    前提:系统安装nodejs 搭建步骤 使用nodejs搭建服务器,简单的来说可以分为三步: require相应的模块 创建服务器 配置端口 启动服务器 必要的nodejs模块 以下模块都是以 var ...

  9. 前端开发 常用用的静态服务器

    1 运用anywhere 安装 :npm install anywhere -g 想要以某个路径作为静态文件服务器的根目录分享,只需要在该目录下执行:anywhere 就会默认8000打开网页, 若文 ...

  10. Nodejs实现的一个静态服务器例子

    参考cnodejs.org上面的静态服务器例子,写了下面的一个nodejs静态服务器例子,里面包含cache,压缩,贴代码如下 /** * 静态文件服务器测试例子 * User: xuwm * Dat ...

最新文章

  1. python语言入门r_小结:jieba分词的Python与R语言基础用法介绍
  2. ZooKeeper简介(安装和使用)
  3. 待处理,待学习(每日更新)
  4. 以整体思维看问题:解决单页应用,系统角色请求覆盖身份唯一标识(本项目中是session_id命名的)发送请求问题...
  5. 同学之间互相出的一些有趣题目
  6. 《Imperfect C++中文版》——1.3 运行期契约:前置条件、后置条件和不变式
  7. 实战系列-HashMap深入剖析
  8. 央视报道短视频侵权 呼吁多方配合保护影视版权
  9. 【安全】Ceotos 7.5.1804 安装openldap 2.4.44
  10. * 与 ** 在调用函数时的作用
  11. cocos2dx 屏幕适配
  12. Java开发之@PostConstruct和@PreDestroy注解
  13. mysql使用mybatis删除不生效_解决myBatis中删除条件的拼接问题
  14. BZOJ2038[2009国家集训队] 小Z的袜子(hose)
  15. 电脑修改服务器时间怎么改,修改服务器时间_如何修改服务器时间 做到同步?...
  16. 对DS证据理论的改进如yager、bayes、孙权、murphy的改进处理,及皮尔逊改进处理
  17. oracle数据库:阿拉伯数字转中文:如367转成:三百六十七
  18. 密钥管理——密钥生命周期管理
  19. 在HTML中打出人民币符号和对勾符号
  20. pytorch 中的torch.bmm

热门文章

  1. ERP来龙与去脉和应用案例。
  2. 给JavaScript 初心者的ES2015 实战
  3. java document对象详解
  4. BTA | 量子链帅初:区块链的开发很漫长,技术突破要有十年心理预期
  5. 【java】this()与super()使用详解
  6. 【idea】两台电脑协同办公
  7. 在Linux下玩QQ游戏
  8. 可汗学院公开课——统计学笔记Task1
  9. 可汗学院公开课——统计学(1)——统计图
  10. bzoj2794 [Poi2012]Cloakroom ( 背包DP+离线 )