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中自定义事件实例
Jun 20 NodeJs
Nodejs全栈框架StrongLoop推荐
Nov 09 NodeJs
nodejs调用cmd命令实现复制目录
May 04 NodeJs
NodeJs读取JSON文件格式化时的注意事项
Sep 25 NodeJs
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 NodeJs
Nodejs 发送Post请求功能(发短信验证码例子)
Feb 09 NodeJs
nodejs爬虫遇到的乱码问题汇总
Apr 07 NodeJs
详解nodejs微信jssdk后端接口
May 25 NodeJs
nodejs模块学习之connect解析
Jul 05 NodeJs
nodejs 图解express+supervisor+ejs的用法(推荐)
Sep 08 NodeJs
nodejs基于WS模块实现WebSocket聊天功能的方法
Jan 12 NodeJs
nodeJs的安装与npm全局环境变量的配置详解
Jan 06 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
mysql 中InnoDB和MyISAM的区别分析小结
2008/04/15 PHP
php5.3 废弃函数小结
2010/05/16 PHP
php 模拟POST|GET操作实现代码
2010/07/20 PHP
PHP实现的简易版图片相似度比较
2015/01/07 PHP
PHP学习记录之数组函数
2018/06/01 PHP
基于jquery的3d效果实现代码
2011/03/23 Javascript
js 分页全选或反选标识实现代码
2011/08/09 Javascript
自己写了一个展开和收起的多更能型的js效果
2013/03/05 Javascript
JavaScript设置首页和收藏页面的小例子
2013/11/11 Javascript
JavaScript实现将数组中所有元素连接成一个字符串的方法
2015/04/06 Javascript
JavaScript中实现map功能代码分享
2015/06/11 Javascript
zepto中使用swipe.js制作轮播图附swipeUp,swipeDown不起效果问题
2015/08/27 Javascript
JavaScript代码判断点击第几个按钮
2015/12/13 Javascript
详解JavaScript对象序列化
2016/01/19 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
2016/06/01 Javascript
jQuery中的AjaxSubmit使用讲解
2016/09/25 Javascript
快速实现jQuery多级菜单效果
2017/02/01 Javascript
JS日程管理插件FullCalendar中文说明文档
2017/02/06 Javascript
原生js实现放大镜
2017/02/20 Javascript
Ajax验证用户名或昵称是否已被注册
2017/04/05 Javascript
JavaScript ES6常用基础知识总结
2019/02/09 Javascript
使用python在校内发人人网状态(人人网看状态)
2014/02/19 Python
Python中使用动态变量名的方法
2014/05/06 Python
Python 通过URL打开图片实例详解
2017/06/01 Python
python Opencv将图片转为字符画
2021/02/19 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
2018/12/05 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
2019/06/03 Python
Python坐标轴操作及设置代码实例
2020/06/04 Python
学python爬虫能做什么
2020/07/29 Python
Python改变对象的字符串显示的方法
2020/08/01 Python
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
2013/10/10 HTML / CSS
SEPHORA新西兰官方网站:购买化妆品和护肤品
2016/12/02 全球购物
节约用水演讲稿
2014/05/21 职场文书
师德师风自我剖析材料
2014/09/27 职场文书
2014入党积极分子批评与自我批评思想报告
2014/10/06 职场文书
信息技术教研组工作总结
2015/08/13 职场文书