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并发异步的回调处理
Dec 21 NodeJs
浅谈Nodejs应用主文件index.js
Aug 28 NodeJs
NodeJS整合银联网关支付(DEMO)
Nov 09 NodeJs
搭建简单的nodejs http服务器详解
Mar 09 NodeJs
NodeJS学习笔记之Module的简介
Mar 24 NodeJs
nodejs个人博客开发第一步 准备工作
Apr 12 NodeJs
详解如何在NodeJS项目中优雅的使用ES6
Apr 22 NodeJs
使用nodejs爬取前程无忧前端技能排行
May 06 NodeJs
Nodejs之http的表单提交
Jul 07 NodeJs
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
Sep 19 NodeJs
详解nodeJs文件系统(fs)与流(stream)
Jan 24 NodeJs
Nodejs实现爬虫抓取数据实例解析
Jul 05 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
Ha0k 0.3 PHP 网页木马修改版
2009/10/11 PHP
php生成的html meta和link标记在body标签里 顶部有个空行
2010/05/18 PHP
php二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
PHP处理excel cvs表格的方法实例介绍
2013/05/13 PHP
thinkphp3查询mssql数据库乱码解决方法分享
2014/02/11 PHP
Javascript 中介者模式实例
2009/12/16 Javascript
理解Javascript_07_理解instanceof实现原理
2010/10/15 Javascript
jquery tab插件精简版分享
2011/09/10 Javascript
网页中可关闭的漂浮窗口实现可自行调节
2013/08/20 Javascript
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
2014/01/09 Javascript
一个非常全面的javascript URL解析函数和分段URL解析方法
2014/04/12 Javascript
关于jQuery判断元素是否存在的问题示例探讨
2014/07/21 Javascript
JQuery中属性过滤选择器用法实例分析
2015/05/18 Javascript
悬浮广告方法日常收集整理
2016/03/18 Javascript
一个超简单的jQuery回调函数例子(分享)
2016/08/08 Javascript
jQuery版AJAX简易封装代码
2016/09/14 Javascript
jquery实现左右滑动式轮播图
2017/03/02 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
vue中使用cropperjs的方法
2018/03/01 Javascript
基于Vue渲染与插件的加载顺序的问题详解
2018/03/05 Javascript
jQuery 实现倒计时天,时,分,秒功能
2018/07/31 jQuery
理解python正则表达式
2016/01/15 Python
Python利用全连接神经网络求解MNIST问题详解
2020/01/14 Python
python实现滑雪游戏
2020/02/22 Python
Python如何实现邮件功能
2020/05/27 Python
用CSS3实现无限循环的无缝滚动的示例代码
2017/11/01 HTML / CSS
英国受欢迎的运动鞋和街头服装商店:Footasylum
2018/06/12 全球购物
面向对象编程OOP的优点
2013/01/22 面试题
程序员机试试题汇总
2012/03/07 面试题
四风个人对照检查材料思想汇报(办公室通用版)
2014/10/07 职场文书
村党的群众路线教育实践活动总结材料
2014/10/31 职场文书
2015年社区工会工作总结
2015/05/26 职场文书
大学军训口号大全
2015/12/24 职场文书
用Python实现一个打字速度测试工具来测试你的手速
2021/05/28 Python
阿里面试Nacos配置中心交互模型是push还是pull原理解析
2022/07/23 Java/Android
Java使用HttpClient实现文件下载
2022/08/14 Java/Android