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学习小结(一)
Jul 06 NodeJs
NodeJS实现阿里大鱼短信通知发送
Jan 17 NodeJs
NodeJS的Promise的用法解析
May 05 NodeJs
图片上传之FileAPI与NodeJs
Jan 24 NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 NodeJs
Nodejs之TCP服务端与客户端聊天程序详解
Jul 07 NodeJs
使用nodeJs来安装less及编译less文件为css文件的方法
Nov 20 NodeJs
CentOS7中源码编译安装NodeJS的完整步骤
Oct 13 NodeJs
深入理解NodeJS 多进程和集群
Oct 17 NodeJs
nodejs基础之常用工具模块util用法分析
Dec 26 NodeJs
一文秒懂nodejs中的异步编程
Jan 28 NodeJs
详解nodejs内置模块
May 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
PHP正则表达式匹配替换与分割功能实例浅析
2017/02/04 PHP
Yii2配置Nginx伪静态的方法
2017/05/05 PHP
浅析js中2个等号与3个等号的区别
2013/08/06 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
AngularJS入门知识之MVW类框架的编程思想探讨
2014/12/08 Javascript
asp.net+js实现金额格式化
2015/02/27 Javascript
Jquery Ajax Error 调试错误的技巧
2015/11/20 Javascript
jQuery+CSS3实现仿花瓣网固定顶部位置带悬浮效果的导航菜单
2016/09/21 Javascript
JS实现异步上传压缩图片
2017/04/22 Javascript
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
Vue写一个简单的倒计时按钮功能
2018/04/20 Javascript
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
Vue 实现展开折叠效果的示例代码
2018/08/27 Javascript
JQuery中的常用事件、对象属性与使用方法分析
2019/12/23 jQuery
[44:10]2018DOTA2亚洲邀请赛 4.5 淘汰赛 EG vs VP 第一场
2018/04/06 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
Linux中Python 环境软件包安装步骤
2016/03/31 Python
Python爬取qq music中的音乐url及批量下载
2017/03/23 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
2018/07/11 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
2019/06/05 Python
Python如何使用k-means方法将列表中相似的句子归类
2019/08/08 Python
python迭代器常见用法实例分析
2019/11/22 Python
一文带你了解Python 四种常见基础爬虫方法介绍
2020/12/04 Python
CSS3中的注音对齐属性ruby-align用法指南
2016/07/01 HTML / CSS
印度低票价航空公司:GoAir
2017/10/11 全球购物
新东网科技Java笔试题
2012/07/13 面试题
董事长秘书岗位职责
2013/11/29 职场文书
珍珠奶茶店创业计划书
2014/01/11 职场文书
电气自动化个人求职信范文
2014/02/03 职场文书
我的中国梦演讲稿300字
2014/08/19 职场文书
《中国梦我的梦》小学生演讲稿
2014/08/20 职场文书
2014年学校国庆主题活动方案
2014/09/16 职场文书
领导走群众路线整改措施思想汇报
2014/10/12 职场文书
英文慰问信
2015/02/14 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
4S店客服专员岗位职责
2015/04/07 职场文书