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的模块写法入门(实例代码)
Mar 07 NodeJs
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
Nov 20 NodeJs
NodeJS学习笔记之Connect中间件应用实例
Jan 27 NodeJs
Nodejs抓取html页面内容(推荐)
Aug 11 NodeJs
详解Nodejs之npm&package.json
Jun 15 NodeJs
nodejs实现OAuth2.0授权服务认证
Dec 27 NodeJs
nodejs搭建本地服务器轻松解决跨域问题
Mar 21 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 NodeJs
NodeJS实现同步的方法
Mar 02 NodeJs
nodejs如何在package.json中设置多条启动命令
Mar 16 NodeJs
nodejs中内置模块fs,path常见的用法说明
Nov 07 NodeJs
nodejs处理tcp连接的核心流程
Feb 26 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使用curl存储cookie的示例
2014/03/31 PHP
WIFI万能钥匙密码查询接口实例
2015/09/28 PHP
Joomla简单判断用户是否登录的方法
2016/05/04 PHP
关于viewport,Ext.panel和Ext.form.panel的关系
2009/05/07 Javascript
Javascript 模式实例 观察者模式
2009/10/24 Javascript
jquery 提示信息显示后自动消失的具体实现
2013/12/18 Javascript
jQuery实现字符串按指定长度加入特定内容的方法
2015/03/11 Javascript
全面解析Bootstrap表单样式的使用
2016/09/09 Javascript
vue2.0全局组件之pdf详解
2017/06/26 Javascript
使用Webpack提高Vue.js应用的方式汇总(四种)
2017/07/10 Javascript
详解JS构造函数中this和return
2017/09/16 Javascript
利用adb shell和node.js实现抖音自动抢红包功能(推荐)
2018/02/22 Javascript
微信小程序实现跳转的几种方式总结(推荐)
2019/04/24 Javascript
vue自定义正在加载动画的例子
2019/11/14 Javascript
[33:28]完美世界DOTA2联赛PWL S3 PXG vs GXR 第三场 12.19
2020/12/24 DOTA
Python获取电脑硬件信息及状态的实现方法
2014/08/29 Python
python中self原理实例分析
2015/04/30 Python
python中 chr unichr ord函数的实例详解
2017/08/06 Python
Python爬虫抓取代理IP并检验可用性的实例
2018/05/07 Python
Python中实例化class的执行顺序示例详解
2018/10/14 Python
Python中Flask-RESTful编写API接口(小白入门)
2019/12/11 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
2020/03/11 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
美国网上鞋城:Shoeline.com
2016/11/17 全球购物
莫斯科购买书籍网站:Book24
2020/01/12 全球购物
应届生会计电算化求职信
2013/10/03 职场文书
医学检验专业大学生求职信
2013/11/18 职场文书
调解协议书
2014/04/16 职场文书
计算机应用专业毕业生求职信
2014/06/03 职场文书
小学趣味运动会加油稿
2014/09/25 职场文书
2014年应急管理工作总结
2014/11/26 职场文书
优秀员工自荐书
2015/03/06 职场文书
你有一份《诚信考试承诺书》待领取
2019/11/13 职场文书
pygame面向对象的飞行小鸟实现(Flappy bird)
2021/04/01 Python
HTML页面滚动时部分内容位置固定不滚动的实现
2021/04/14 HTML / CSS
MySQL kill不掉线程的原因
2021/05/07 MySQL