返回顶部
首页 > 资讯 > 服务器 >Node.js静态文件服务器改进版
  • 414
分享到

Node.js静态文件服务器改进版

静态改进版文件服务器 2022-06-04 17:06:53 414人浏览 薄情痞子
摘要

首先还是先感谢GitHub,感谢github上提供此段源码的作者。跟昨晚的来比今天的静态文件服务器有点点复杂些,可以学到很多新的东西。 仔细会发现这次的代码多了一个fs.stat函数和ReadStream

首先还是先感谢GitHub,感谢github上提供此段源码的作者。跟昨晚的来比今天的静态文件服务器有点点复杂些,可以学到很多新的东西。

仔细会发现这次的代码多了一个fs.stat函数和ReadStream对象的pipe函数,stat这个函数是用来获取文件信息。第一个参数是传入文件路径,第二个则是回调函数,回调函数的第二个参数stats的属性为文件的基本信息。pipe函数用于将这个可读流和destination目标可写流连接起来,传入这个流中的数据将会写入到destination流中。通过在必要时暂停和恢复流,来源流和目的流得以保持同步。

该静态文件服务器的改进点在于使用了Last-Modified和If-Modified-Since报文头,可以不必要给浏览器返回它已经存在的文件。顺便可以根据浏览器请求资源的压缩方式返回给资源进行gzip或者deflate压缩。


var PORT = 8000;
var Http = require("http");
var url = require("url");
var fs = require("fs");
var path = require("path");
var mime = require("./mime").types;
var config = require("./config");
var zlib = require("zlib");
var server = http.createServer(function(request, response) {
 response.setHeader("Server", "node/V5");
 var pathname = url.parse(request.url).pathname;
 console.log("url = " + pathname);
 if (pathname.slice(-1) === "/") {
  pathname = pathname + config.Welcome.file;
 }
 var realPath = __dirname + "/" + path.join("assets", path.nORMalize(pathname.replace(/../g, "")));
 console.log("realPath = " + realPath);
 var pathHandle = function (realPath) {
  fs.stat(realPath, function (err, stats) {
   if (err) {
    response.writeHead(404, "Not Found", {'Content-Type': 'text/plain'});
    response.write("stats = " + stats);
    response.write("This request URL " + pathname + " was not found on this server.");
    response.end();
   } else {
    if (stats.isDirectory()) {
     realPath = path.join(realPath, "/", config.Welcome.file);
     pathHandle(realPath);
    } else {
     var ext = path.extname(realPath);
     ext = ext ? ext.slice(1) : 'unknown';
     var contentType = mime[ext] || "text/plain";
     response.setHeader("Content-Type", contentType);
     //获得文件的修改时间 
     var lastModified = stats.mtime.toUTCString();
     var ifModifiedSince = "If-Modified-Since".toLowerCase();
     //设置Last-Modified
     //服务器给浏览器返回文件最后一次修改时间Last-Modified
     response.setHeader("Last-Modified", lastModified);

     if (ext.match(config.Expires.fileMatch)) {
      var expires = new Date();
      expires.setTime(expires.getTime() + config.Expires.maxAge * 1000);
      response.setHeader("Expires", expires.toUTCString());
      response.setHeader("Cache-Control", "max-age=" + config.Expires.maxAge);
     }
     //服务器接收浏览器发送过来的If-Modified-Since报文头
     //日期相同表示该资源没有变化则返回304
     //告诉浏览器该资源你已经有了,不需要再请求了
     if (request.headers[ifModifiedSince] && lastModified == request.headers[ifModifiedSince]) {
      response.writeHead(304, "Not Modified");
      response.end();
     } else {
      var raw = fs.createReadStream(realPath);
      var acceptEncoding = request.headers['accept-encoding'] || "";
      var matched = ext.match(config.Compress.match); 
      if (matched && acceptEncoding.match(/bgzipb/)) {
       response.writeHead(200, "Ok", {'Content-Encoding': 'gzip'});
       raw.pipe(zlib.createGzip()).pipe(response);
      } else if (matched && acceptEncoding.match(/bdeflateb/)) {
       response.writeHead(200, "Ok", {'Content-Encoding': 'deflate'});
       raw.pipe(zlib.createDeflate()).pipe(response);
      } else {
       response.writeHead(200, "Ok");
       raw.pipe(response);
      }
     }
    }
   }
  });
 };

 pathHandle(realPath);
});
server.listen(PORT);
console.log("Server runing at port: " + PORT + ".");

Expires字段声明了一个网页或URL地址不再被浏览器缓存的时间,一旦超过了这个时间,浏览器都应该联系原始服务器。这里设置失效时间为1年。


exports.Expires = {
 fileMatch: /^(gif|png|jpg|js|CSS)$/ig,
 maxAge: 60*60*24*365
};
exports.Compress = {
 match: /css|js|html/ig
};
exports.Welcome = {
 file: "index.html"
};

枚举各种资源的类型,可根据扩展名设置Content-Type。


exports.types = {
 "css": "text/css",
 "gif": "image/gif",
 "html": "text/html",
 "ico": "image/x-icon",
 "jpeg": "image/jpeg",
 "jpg": "image/jpeg",
 "js": "text/javascript",
 "JSON": "application/json",
 "pdf": "application/pdf",
 "png": "image/png",
 "svg": "image/svg+xml",
 "swf": "application/x-shockwave-flash",
 "tiff": "image/tiff",
 "txt": "text/plain",
 "wav": "audio/x-wav",
 "wma": "audio/x-ms-wma",
 "wmv": "video/x-ms-wmv",
 "xml": "text/xml"
};

--结束END--

本文标题: Node.js静态文件服务器改进版

本文链接: https://lsjlt.com/news/13108.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Node.js静态文件服务器改进版
    首先还是先感谢github,感谢github上提供此段源码的作者。跟昨晚的来比今天的静态文件服务器有点点复杂些,可以学到很多新的东西。 仔细会发现这次的代码多了一个fs.stat函数和ReadStream...
    99+
    2022-06-04
    静态 改进版 文件服务器
  • Node.js开发静态资源服务器
    目录正文静态资源服务器模块化最后正文 在09年Node.js出来后,让前端开发人员的开发路线变的不再那么单调,经过这么多年的发展,我们的开发基本已经离不开Node.js,不管是用作于...
    99+
    2022-11-13
    Node.js静态资源服务器 Node.js静态资源
  • 如何使用Node写静态文件服务器
    目录背景功能介绍代码实现基础代码实现大文件优化Stream减少文件传输带宽使用浏览器缓存什么是Etag总结背景 作为前端工程师,我想大家一定对静态文件服务器不会陌生。所谓的静态文件服...
    99+
    2024-04-02
  • 如何进行Nginx静态文件服务器搭建及autoindex模块解析
    这期内容当中小编将会给大家带来有关如何进行Nginx静态文件服务器搭建及autoindex模块解析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。ngx_http_autoindex_modulengx_h...
    99+
    2023-06-28
  • Apache如何配置静态文件的服务
    要配置Apache服务器来提供静态文件服务,需要在Apache的配置文件中添加以下几行代码: 首先要确保Apache已经安装和启动了。然后找到Apache的配置文件,通常在 /etc/apache2/apache2.conf 或 /et...
    99+
    2024-07-05
    apache
  • Ubuntu22.04服务器版本配置静态IP地址
    进入文件/etc/netplan/00-installer-config.yam vim /etc/netplan/00-installer-config.yaml 配置文件内容 network: ethernets: ens33:...
    99+
    2023-09-02
    ubuntu ip
  • 如何使用Node.js搭建一个静态Web服务器
    这篇文章主要介绍了如何使用Node.js搭建一个静态Web服务器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用Node.js搭建一个静态Web服务器文章都会有所收获,下...
    99+
    2024-04-02
  • Python多任务版静态Web服务器实现示例
    目录概述实现步骤1.导入threading模块2.设置端口号复用, 程序退出端口立即释放3.当客户端和服务器建立连接程,创建子线程4.设置守护主进程5.启动子线程代码实现概述 使用多...
    99+
    2024-04-02
  • Python多任务版静态Web服务器如何实现
    这篇“Python多任务版静态Web服务器如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python多任务版静态We...
    99+
    2023-07-02
  • 静态文件怎么在Spring MVC中进行访问
    这篇文章将为大家详细讲解有关静态文件怎么在Spring MVC中进行访问,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。方案一:激活Tomcat的defaultServlet来处理静态文件Xm...
    99+
    2023-05-31
    springmvc
  • 如何使用Node.js实现一个静态资源服务器
    今天就跟大家聊聊有关如何使用Node.js实现一个静态资源服务器,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。项目涉及...
    99+
    2024-04-02
  • linux中怎么即时设置一个静态文件服务器
    这篇文章主要为大家展示了“linux中怎么即时设置一个静态文件服务器”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“linux中怎么即时设置一个静态文件服务器”这篇文章吧。曾经想通过网络共享你的文...
    99+
    2023-06-16
  • 如何使用 Chi 路由器提供静态文件夹服务
    php小编苹果为您介绍如何使用Chi路由器提供静态文件夹服务。Chi是一个轻量级的Go语言Web框架,它提供了简洁、高效的路由功能。通过Chi,我们可以轻松地搭建一个静态文件夹服务,将...
    99+
    2024-02-09
    go语言
  • Node.js+jade抓取博客所有文章生成静态html文件的实例
    这篇文章,我们就把上文中采集到的所有文章列表的信息整理一下,开始采集文章并且生成静态html文件了.先看下我的采集效果,我的博客目前77篇文章,1分钟不到就全部采集生成完毕了,这里我截了部分的图片,文件名用...
    99+
    2022-06-04
    静态 实例 文件
  • Centos怎么设置静态IP及修改Centos配置文件
    这篇文章主要讲解了“Centos怎么设置静态IP及修改Centos配置文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Centos怎么设置静态IP及修改Centos配置文件”吧!特别值得一...
    99+
    2023-06-10
  • 使用nodejs、Python写的一个简易HTTP静态文件服务器
    日常开发过程中,我们经常需要修改一些放在 CDN 上的静态文件(如 JavaScript、CSS、HTML 文件等),这个过程中,我们希望能有一种方式将线上 CDN 的目录映射为本地硬盘上的某个目录,这样,...
    99+
    2022-06-04
    静态 简易 文件服务器
  • 使用Node.js搭建静态资源服务详细教程
    对于Node.js新手,搭建一个静态资源服务器是个不错的锻炼,从最简单的返回文件或错误开始,渐进增强,还可以逐步加深对http的理解。那就开始吧,让我们的双手沾满网络请求! Note: 当然在项目中如果有使...
    99+
    2022-06-04
    静态 教程 详细
  • Gin框架快速创建静态文件下载Web服务
    目录介绍 安装 快速开始 1.创建 boot.yaml 2.创建 main.go 3.文件夹结构 4.验证 从 pkger 读取文件 (嵌入式静态文件) 1.下载 pkger 命令行...
    99+
    2024-04-02
  • 用Nodejs搭建服务器访问html、css、JS等静态资源文件
    为了测一个附近门店的功能,需要配置一下服务器进行测试。本来打算用apache的,后来想自己是做前端的,好久没有用过Nodejs了何不用所学的知识自己配一下呢,说动手就手。 第一步,俗话说的好,工欲善其事,必...
    99+
    2022-06-04
    静态 服务器 文件
  • 在windows上用nodejs搭建静态文件服务器的简单方法
    在windows上用nodejs搭建一个静态文件服务器,即使你一点基础没有也能学会nodejs静态文件服务器的搭建,本文介绍的非常详细,很适合零基础入门的朋友学习。 首先安装nodejs: •...
    99+
    2022-06-04
    静态 简单 文件服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作