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 相关文章推荐
基于 Docker 开发 NodeJS 应用
Jul 30 NodeJs
Nodejs中session的简单使用及通过session实现身份验证的方法
Feb 04 NodeJs
Nodejs获取网络数据并生成Excel表格
Mar 31 NodeJs
nodejs和php实现图片访问实时处理
Jan 05 NodeJs
nodejs搭建本地http服务器教程
Mar 13 NodeJs
win系统下nodejs环境安装配置
May 04 NodeJs
Nodejs实现多房间简易聊天室功能
Jun 20 NodeJs
深入解析nodejs HTTP服务
Jul 25 NodeJs
nodejs body-parser 解析post数据实例
Jul 26 NodeJs
详解nodejs通过响应回写的方式渲染页面资源
Apr 07 NodeJs
nodejs实现用户登录路由功能
May 22 NodeJs
nodeJs项目在阿里云的简单部署
Nov 27 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
Sorting Array Values in PHP(数组排序)
2011/09/15 PHP
Php中用PDO查询Mysql来避免SQL注入风险的方法
2013/04/25 PHP
php下载文件源代码(强制任意文件格式下载)
2014/05/09 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
2016/09/02 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
2018/09/26 PHP
详解PHP变量传值赋值和引用赋值变量销毁
2019/03/23 PHP
PHP常用字符串函数用法实例总结
2020/06/04 PHP
firefox中JS读取XML文件
2006/12/21 Javascript
JavaScript QueryString解析类代码
2010/01/17 Javascript
简洁Ajax函数处理(示例代码)
2013/11/15 Javascript
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
2016/02/17 Javascript
浅析jquery如何判断滚动条滚到页面底部并执行事件
2016/04/29 Javascript
vue弹窗组件使用方法
2018/04/28 Javascript
详解Vue取消eslint语法限制
2018/08/04 Javascript
vue 配置多页面应用的示例代码
2018/10/22 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
2018/11/23 Javascript
基于three.js实现的3D粒子动效实例代码
2019/04/09 Javascript
Python识别快递条形码及Tesseract-OCR使用详解
2019/07/15 Python
python如何使用Redis构建分布式锁
2020/01/16 Python
keras 特征图可视化实例(中间层)
2020/01/24 Python
python生成大写32位uuid代码
2020/03/03 Python
基于python爬取链家二手房信息代码示例
2020/10/21 Python
x-ua-compatible content=”IE=7, IE=9″意思理解
2013/07/22 HTML / CSS
HTML5 video播放器全屏(fullScreen)方法实例
2015/04/24 HTML / CSS
英国家电购物网站:Sonic Direct
2019/03/26 全球购物
美国肌肉和力量商店:Muscle & Strength
2019/06/22 全球购物
美国眼镜网站:LensCrafters
2020/01/19 全球购物
生物技术研究生自荐信
2013/11/12 职场文书
光荣入党自我鉴定
2014/01/22 职场文书
食品安全汇报材料
2014/08/18 职场文书
公务员年度考核个人总结
2015/02/12 职场文书
2016十一国庆节慰问信
2015/12/01 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/04/22 无线电
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js