nodejs一个简单的文件服务器的创建方法


Posted in NodeJs onSeptember 13, 2019

简单的文件服务器

有时候,我们想读取一些服务器上的文件,但是又不想写太复杂的程序,可以考虑用nodejs,可以很简单的写出一个文件服务器

下面是我写的一个简单的文件服务器,附带缓存功能,这是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后,在规定的时间内还是会请求服务器,这个还需要再看一下怎么回事,要是有人了解的话可以告诉我一下,谢谢。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
Nodejs实现的一个简单udp广播服务器、客户端
Sep 25 NodeJs
NodeJs基本语法和类型
Feb 13 NodeJs
nodejs实现遍历文件夹并统计文件大小
May 28 NodeJs
nodeJs爬虫获取数据简单实现代码
Mar 29 NodeJs
NodeJS的Promise的用法解析
May 05 NodeJs
NodeJS基础API搭建服务器详细过程记录
Apr 01 NodeJs
手把手教你把nodejs部署到linux上跑出hello world
Jun 19 NodeJs
Nodejs模块的调用操作实例分析
Dec 25 NodeJs
NodeJs之word文件生成与解析的实现代码
Apr 01 NodeJs
nodejs如何在package.json中设置多条启动命令
Mar 16 NodeJs
nodejs+koa2 实现模仿springMVC框架
Oct 21 NodeJs
如何利用nodejs实现命令行游戏
Nov 24 NodeJs
nodejs的安装使用与npm的介绍
Sep 11 #NodeJs
5分钟教你用nodeJS手写一个mock数据服务器的方法
Sep 10 #NodeJs
NodeJS 文件夹拷贝以及删除功能
Sep 03 #NodeJs
纯异步nodejs文件夹(目录)复制功能
Sep 03 #NodeJs
nodejs文件夹深层复制功能
Sep 03 #NodeJs
Nodejs中使用puppeteer控制浏览器中视频播放功能
Aug 26 #NodeJs
nodejs简单抓包工具使用详解
Aug 23 #NodeJs
You might like
谈谈PHP语法(5)
2006/10/09 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
2013/05/23 PHP
Laravel框架表单验证详解
2014/09/04 PHP
PHP 对象继承原理与简单用法示例
2020/04/21 PHP
jQuery autocomplete插件修改
2009/04/17 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/20 Javascript
兼容主流浏览器的iframe自适应高度js脚本
2014/01/10 Javascript
JS合并数组的几种方法及优劣比较
2014/09/19 Javascript
排序算法的javascript实现与讲解(99js手记)
2014/09/28 Javascript
浅谈mint-ui loadmore组件注意的问题
2017/11/08 Javascript
基于Bootstrap实现城市三级联动
2017/11/23 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
详解Js里的for…in和for…of的用法
2019/03/28 Javascript
完美解决通过IP地址访问VUE项目的问题
2020/07/18 Javascript
Python输出9*9乘法表的方法
2015/05/25 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
2016/06/27 Python
python 实现A*算法的示例代码
2018/08/13 Python
python 机器学习之支持向量机非线性回归SVR模型
2019/06/26 Python
关于python中密码加盐的学习体会小结
2019/07/15 Python
pytorch实现CNN卷积神经网络
2020/02/19 Python
基于python实现计算且附带进度条代码实例
2020/03/31 Python
PageFactory设计模式基于python实现
2020/04/14 Python
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
快速创建 HTML5 Canvas 电信网络拓扑图的示例代码
2018/03/21 HTML / CSS
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
优秀干部获奖感言
2014/01/31 职场文书
教研处工作方案
2014/05/26 职场文书
班级心理活动总结
2014/07/04 职场文书
乡镇创先争优活动总结
2014/08/28 职场文书
运动与健康自我评价
2015/03/09 职场文书
社区党务工作总结2015
2015/05/19 职场文书
学生检讨书范文
2019/06/24 职场文书
python xlwt模块的使用解析
2021/04/13 Python
Python中可变和不可变对象的深入讲解
2021/08/02 Python
Pytorch中expand()的使用(扩展某个维度)
2022/07/15 Python
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
2022/08/14 Python