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文件操作模块FS(File System)常用函数简明总结
Jun 05 NodeJs
nodejs 实现模拟form表单上传文件
Jul 14 NodeJs
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
Jul 26 NodeJs
初识NodeJS服务端开发入门(Express+MySQL)
Apr 07 NodeJs
nodejs个人博客开发第七步 后台登陆
Apr 12 NodeJs
详解如何在NodeJS项目中优雅的使用ES6
Apr 22 NodeJs
nodejs实现OAuth2.0授权服务认证
Dec 27 NodeJs
nodejs读取本地中文json文件出现乱码解决方法
Oct 10 NodeJs
关于NodeJS中的循环引用详解
Jul 23 NodeJs
nodejs使用socket5进行代理请求的实现
Feb 21 NodeJs
Node.js实现爬取网站图片的示例代码
Apr 04 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中实现获取IP和地理位置类分享
2015/02/10 PHP
PHP count()函数讲解
2019/02/03 PHP
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
jquery 模式对话框终极版实现代码
2009/09/28 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
2012/12/07 Javascript
邮箱下拉自动填充选择示例代码附图
2014/04/03 Javascript
jQuery前端框架easyui使用Dialog时bug处理
2014/12/05 Javascript
完美实现仿QQ空间评论回复特效
2015/05/06 Javascript
jQuery仿淘宝网产品品牌隐藏与显示效果
2015/09/01 Javascript
jQuery实现的AJAX简单弹出层效果代码
2015/11/26 Javascript
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
vue的Virtual Dom实现snabbdom解密
2017/05/03 Javascript
js 公式编辑器 - 自定义匹配规则 - 带提示下拉框 - 动态获取光标像素坐标
2018/01/04 Javascript
JavaScript代码实现txt文件的上传预览功能
2018/03/27 Javascript
Javascript实现购物车功能的详细代码
2018/05/08 Javascript
微信小程序webview组件交互,内联h5页面并网页实现微信支付实现解析
2019/08/16 Javascript
js实现无限瀑布流实例方法
2019/09/16 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
微信小程序 冒泡事件原理解析
2019/09/27 Javascript
Vue ElementUI实现:限制输入框只能输入正整数的问题
2020/07/31 Javascript
解决vue页面刷新,数据丢失的问题
2020/11/24 Vue.js
JS实现选项卡插件的两种写法(jQuery和class)
2020/12/30 jQuery
[09:37]2018DOTA2国际邀请赛寻真——不懈追梦的Team Serenity
2018/08/13 DOTA
python 删除列表里所有空格项的方法总结
2018/04/18 Python
python 将字符串完成特定的向右移动方法
2019/06/11 Python
对Django项目中的ORM映射与模糊查询的使用详解
2019/07/18 Python
Pyinstaller加密打包应用的示例代码
2020/06/11 Python
Pygame框架实现飞机大战
2020/08/07 Python
HTML5 Canvas 绘图——使用 Canvas 绘制图形图文教程 使用html5 canvas 绘制精美的图
2015/08/31 HTML / CSS
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
2014自荐信的写作技巧
2014/01/28 职场文书
环保口号大全
2014/06/12 职场文书
国际贸易实务实训报告
2014/11/05 职场文书
六年级学生期末评语
2014/12/26 职场文书
详解解Django 多对多表关系的三种创建方式
2021/08/23 Python
maven依赖的version声明控制方式
2022/01/18 Java/Android