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教程 安装express及配置app.js文件的详细步骤
May 11 NodeJs
nodejs通过phantomjs实现下载网页
May 04 NodeJs
NodeJS连接MongoDB数据库时报错的快速解决方法
May 13 NodeJs
解析NodeJS异步I/O的实现
Apr 13 NodeJs
nodejs入门教程三:调用内部和外部方法示例
Apr 24 NodeJs
Nodejs读取文件时相对路径的正确写法(使用fs模块)
Apr 27 NodeJs
NodeJS爬虫实例之糗事百科
Dec 14 NodeJs
nodejs中Express与Koa2对比分析
Feb 06 NodeJs
webstorm中配置nodejs环境及npm的实例
May 15 NodeJs
Nodejs实现用户注册功能
Apr 14 NodeJs
Nodejs异步流程框架async的方法
Jun 07 NodeJs
NodeJS和浏览器中this关键字的不同之处
Mar 03 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中使用Oracle数据库(4)
2006/10/09 PHP
PHP 各种排序算法实现代码
2009/08/20 PHP
PHP文件注释标记及规范小结
2012/04/01 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
2013/06/25 PHP
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
2014/05/04 PHP
PHP中使用Memache作为进程锁的操作类分享
2015/03/30 PHP
thinkPHP模板引擎用法示例
2016/12/08 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
用js实现上传图片前的预览(TX的面试题)
2007/08/14 Javascript
使用JavaScript库还是自己写代码?
2010/01/28 Javascript
JSQL  一个 web DB 的封装
2010/05/05 Javascript
javascript检查表单数据是否改变的方法
2013/07/30 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
EasyUI实现第二层弹出框的方法
2015/03/01 Javascript
JavaScript代码生成PDF文件的方法
2016/02/26 Javascript
node.js 动态执行脚本
2016/06/02 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
ES6中Math对象新增的方法实例详解
2017/04/25 Javascript
JavaScript登录验证基础教程
2017/11/01 Javascript
对vue.js中this.$emit的深入理解
2018/02/23 Javascript
vue路由组件按需加载的几种方法小结
2018/07/12 Javascript
基于layui数据表格以及传数据的方式
2018/08/19 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
2020/04/25 Javascript
[01:53]3.19 DOTA2发布会 现场精彩Coser表演
2014/03/25 DOTA
使用python实现BLAST
2018/02/12 Python
对python中的乘法dot和对应分量相乘multiply详解
2018/11/14 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
2020/04/23 Python
Java Unsafe类实现原理及测试代码
2020/09/15 Python
毕业研究生的自我鉴定
2013/11/30 职场文书
建议书怎么写
2014/03/12 职场文书
法制教育演讲稿
2014/09/10 职场文书
民事辩护词范文
2015/05/21 职场文书
导游词之镜泊湖
2019/12/09 职场文书
python正则表达式re.search()的基本使用教程
2021/05/21 Python
国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程
2021/10/05 Javascript