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访问ActiveX对象,以操作Access数据库为例。
Dec 15 NodeJs
利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
Nov 18 NodeJs
nodejs命令行参数处理模块commander使用实例
Sep 17 NodeJs
NodeJS学习笔记之FS文件模块
Jan 13 NodeJs
浅析nodejs实现Websocket的数据接收与发送
Nov 19 NodeJs
nodejs入门教程三:调用内部和外部方法示例
Apr 24 NodeJs
配置nodejs环境的方法
May 13 NodeJs
nodejs mysql 实现分页的方法
Jun 06 NodeJs
Nodejs之http的表单提交
Jul 07 NodeJs
nodejs 日志模块winston的使用方法
May 02 NodeJs
图解NodeJS实现登录注册功能
Sep 16 NodeJs
nodejs实现百度舆情接口应用示例
Feb 07 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 Mysqli 常用代码集合
2016/11/12 PHP
php5.x禁用eval的操作方法
2018/10/19 PHP
Linux基于php-fpm模式的lamp搭建phpmyadmin的方法
2018/10/25 PHP
jquery下将选择的checkbox的id组成字符串的方法
2010/11/28 Javascript
jQuery创建平滑的页面滚动(顶部或底部)
2013/02/26 Javascript
自己封装的javascript事件队列函数版
2014/06/12 Javascript
一个不错的js html页面倒计时可精确到秒
2014/10/22 Javascript
JavaScript实现定时隐藏与显示图片的方法
2015/08/06 Javascript
JavaScript实现弹出模态窗体并接受传值的方法
2016/02/12 Javascript
js控制TR的显示隐藏
2016/03/04 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
基于VUE.JS的移动端框架Mint UI的使用
2017/10/11 Javascript
vue加载完成后的回调函数方法
2018/09/07 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
2019/01/28 jQuery
JavaScript实现图片的放大缩小及拖拽功能示例
2019/05/14 Javascript
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
关于JSON解析的实现过程解析
2019/10/08 Javascript
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
Python备份Mysql脚本
2008/08/11 Python
python实现读取命令行参数的方法
2015/05/22 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
2017/07/11 Python
Python使用pyautocad+openpyxl处理cad文件示例
2019/07/11 Python
基于python3 的百度图片下载器的实现代码
2019/11/05 Python
np.random.seed() 的使用详解
2020/01/14 Python
Python requests模块安装及使用教程图解
2020/06/30 Python
Python连接mysql数据库及简单增删改查操作示例代码
2020/08/03 Python
python用Configobj模块读取配置文件
2020/09/26 Python
加拿大当代时尚服饰、配饰和鞋类专业零售商和制造商:LE CHÂTEAU
2017/10/06 全球购物
DJI大疆德国官方商城:大疆无人机
2018/09/01 全球购物
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
机电专业毕业生求职信
2013/10/27 职场文书
优秀志愿者事迹材料
2014/02/03 职场文书
预备党员思想汇报1000字
2014/10/07 职场文书
谢师宴学生答谢词
2015/09/30 职场文书
五星级酒店宣传口号
2015/12/25 职场文书
idea下配置tomcat避坑详解
2022/04/12 Servers