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中实现sleep功能实例
Mar 24 NodeJs
nodejs中使用多线程编程的方法实例
Mar 24 NodeJs
Nodejs如何搭建Web服务器
Mar 28 NodeJs
浅谈Nodejs中的作用域问题
Dec 26 NodeJs
详解nodejs模板引擎制作
Jun 14 NodeJs
Nodejs 复制文件/文件夹的方法
Aug 24 NodeJs
CentOS7中源码编译安装NodeJS的完整步骤
Oct 13 NodeJs
nodejs 使用http进行post或get请求的实例(携带cookie)
Jan 03 NodeJs
nodejs中实现用户注册路由功能
May 20 NodeJs
Nodejs libuv运行原理详解
Aug 21 NodeJs
nodejs制作小爬虫功能示例
Feb 24 NodeJs
ubuntu系统下使用pm2设置nodejs开机自启动的方法
May 12 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
苏联队长,苏联超人蝙蝠侠,这些登场的“山寨”英雄真的很严肃
2020/04/09 欧美动漫
短波收音机简介
2021/03/01 无线电
php下删除字符串中HTML标签的函数
2008/08/27 PHP
供参考的 php 学习提高路线分享
2011/10/23 PHP
鸡肋的PHP单例模式应用详解
2013/06/03 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
php打开文件fopen函数的使用说明
2013/07/05 PHP
php ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
php定义数组和使用示例(php数组的定义方法)
2014/03/29 PHP
php通过获取头信息判断图片类型的方法
2015/06/26 PHP
Prototype使用指南之dom.js
2007/01/10 Javascript
JavaScript 应用技巧集合[推荐]
2009/08/30 Javascript
基于jQuery架构javascript基础体系
2011/01/01 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
2011/03/10 Javascript
判定是否原生方法的JS代码
2013/11/12 Javascript
javascript arguments使用示例
2014/12/16 Javascript
javascript判断复选框是否选中的方法
2015/10/16 Javascript
以jQuery中$.Deferred对象为例讲解promise对象是如何处理异步问题
2015/11/13 Javascript
JS之if语句对接事件动作逻辑(详解)
2017/06/28 Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
vue异步axios获取的数据渲染到页面的方法
2018/08/09 Javascript
微信小程序实现动态获取元素宽高的方法分析
2018/12/10 Javascript
js中的深浅拷贝问题简析
2019/05/10 Javascript
element-ui 实现响应式导航栏的示例代码
2020/05/08 Javascript
[43:41]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
Python实现删除文件中含“指定内容”的行示例
2017/06/09 Python
python+pillow绘制矩阵盖尔圆简单实例
2018/01/16 Python
利用Python实现kNN算法的代码
2019/08/16 Python
Python unittest基本使用方法代码实例
2020/06/29 Python
FitFlop澳大利亚官网:英国符合人体工学的鞋类品牌
2017/06/05 全球购物
线程同步的方法
2016/11/23 面试题
幼儿园保育员岗位职责
2014/04/13 职场文书
销售经理工作检讨书
2015/02/19 职场文书
2015年底工作总结范文
2015/05/15 职场文书
致接力运动员加油稿
2015/07/21 职场文书