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、Python写的一个简易HTTP静态文件服务器
Jul 18 NodeJs
nodejs中操作mysql数据库示例
Dec 20 NodeJs
Nodejs Stream 数据流使用手册
Apr 17 NodeJs
详解Nodejs的timers模块
Dec 22 NodeJs
使用nodejs下载风景壁纸
Feb 05 NodeJs
NodeJs中express框架的send()方法简介
Jun 20 NodeJs
nodejs对express中next函数的一些理解
Sep 08 NodeJs
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
Nov 01 NodeJs
Nodejs实现WebSocket代码实例
May 19 NodeJs
使用nodejs实现JSON文件自动转Excel的工具(推荐)
Jun 24 NodeJs
Nodejs + sequelize 实现增删改查操作
Nov 07 NodeJs
Node.js实现爬取网站图片的示例代码
Apr 04 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的命名空间(一)
2018/02/21 PHP
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
json格式化/压缩工具 Chrome插件扩展版
2010/05/25 Javascript
Javascript中获取出错代码所在文件及行数的代码
2010/09/23 Javascript
Javascript自定义排序 node运行 实例
2013/06/05 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
2013/11/04 Javascript
Jquery使用val方法读写value值
2015/05/18 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
jQuery EasyUI 菜单与按钮之创建简单的菜单和链接按钮
2015/11/18 Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
2016/05/12 Javascript
node.js cookie-parser之parser.js
2016/06/06 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
2016/07/24 Javascript
onmouseover事件和onmouseout事件全面理解
2016/08/15 Javascript
详细分析jsonp的原理和实现方式
2017/11/20 Javascript
微信小程序-可移动菜单的实现过程详解
2019/06/24 Javascript
Vue的生命周期操作示例
2019/09/17 Javascript
iview实现动态表单和自定义验证时间段重叠
2021/01/10 Javascript
Python实现嵌套列表及字典并按某一元素去重复功能示例
2017/11/30 Python
python使用socket创建tcp服务器和客户端
2018/04/12 Python
pygame游戏之旅 添加游戏暂停功能
2018/11/21 Python
pytorch 实现模型不同层设置不同的学习率方式
2020/01/06 Python
用60行代码实现Python自动抢微信红包
2021/02/04 Python
html5拖拽应用记录及注意点
2020/05/27 HTML / CSS
房产销售经理职责
2013/12/20 职场文书
医院护士的求职信
2014/01/03 职场文书
进口业务员岗位职责
2014/04/06 职场文书
卖车协议书
2014/04/21 职场文书
讲文明树新风演讲稿
2014/05/12 职场文书
保密工作承诺书
2014/08/29 职场文书
教师党员个人整改措施材料
2014/09/16 职场文书
机关作风建设自查报告
2014/10/22 职场文书
2014幼儿教师个人工作总结
2014/12/03 职场文书
学校节水倡议书
2015/04/29 职场文书
2016年中学端午节主题活动总结
2016/04/01 职场文书
Python+Appium自动化测试的实战
2021/06/30 Python
浅析Python OpenCV三种滤镜效果
2022/04/11 Python