Nodejs-基础-fs

前言

前文我们已经聊过原生NodeJS如何打一个最简单的服务器,也就是nodejs http模块 在http篇咱们结尾作了一个小东西 - 详细文章地址:Nodejs-基础-httpjavascript

也就是这个,这里面我们直接用switch来判断请求的什么,那这个你们也都知道,若是东西多了,就写疯了, 并且,如今只能输入一个字符串,要是请求个图片或者视频,就不行了,固然了,base64也能够,不过。。。。。。那玩意体积不还大么,再说也有更好的方法,也就是我们今天说的——fs模块html

那么今天我就来聊一聊fs模块前端

功能:fs主要是读文件和写文件用的,用途很是广法也很是方便,也是系统自带的文件类型操做的模块java

应用场景

  1. 在web端咱们一般会须要一些埋点,所谓埋点也就是看看用户都对什么感兴趣,都点了些什么,搜集数据供数据部分分析,作可视化也好作一些分析模型都好,都是须要详细的数据的,这些通常都是后台保存好现成的文件,对文件进行增删改以及格式整理
  2. 在写一些工具的时候,相似webpack这种,都是须要用fs读出来再去交给babel编译成ast语法树而后处理完再写入新文件
  3. 在一些上传图片、视频的时候会用到

用法

说了那么多,具体怎么用呢,其实fs有不少不少方法,复制粘贴移动的,我们这里说两个主要而且经常使用的node

fs.readFile(文件名,function(err, data){}) —— 读文件 fs.writeFile(文件名,内容, function(err){}) —— 写文件webpack

这两个方法从名字都能看出来他俩是干哈得了,至于为何会有回调呢,可能会有人有疑问,回调回调的就回调地狱了,套不少层,很麻烦对不对 实际上是这样的,想象一下,服务器是同步仍是异步的(说了句废话),同步异步用最俗的话来讲就是异步一快跑同步等着前一个跑完,那么每一个readFile确定都须要一个回调,可是回调地狱怎么解决呢,前端同窗应该了解的比较多, async await promise 真香,事实上node 和 node框架express都有这个问题,就是项目容易回调地狱,这也就是为何express官方团队都受不了express了 又写了个koa,固然,express这些和node原生相关的库也都是有promise版或者有库能够统一转换的,这个不用担忧,之后的文章会提到web

好的,那让咱们直接来试试express

demo

readFile

首先 建两个文件,像这样 image.pngpromise

而后边写 fs.js 服务器

const fs = require('fs');

fs.readFile('./1.txt', (err, data) => {
  if (err) {
    console.log('读取失败');
    return;
  }
  console.log(data);
});

复制代码

readFile 和 writeFile 的回调函数里都有两个参数,一个是err,一个是data,这个很好理解,一个是读文件失败缘由,一个就是真实读过来的数据

而后我们在1.txt里随便写点文字,像这样👇 image.png

这时候咱们运行fs文件 node fs.js , 就会看到👇 image.png

Buffer 是原始二进制数据,看到这可能有人有疑问,为何我写的是文字,出来的也是二进制呢,直接给我不就完了么,是这样的,对于服务器来讲,单处理文本数据就好了?确定不行,还有一些图片视频无法直接展现的,因此统一全是二进制输出。 固然了,若是就是想看到文字,也是能够的直接toString()就能够,像这样👇 image.png

writeFile

看了上面的例子,其实writeFile也是更没有什么了,这里就直接粘例子了 image.png image.png

 是否是很简单~

跟http模块demo整合

上篇文章http模块作了个例子

const http = require('http');

let server = http.createServer((req, res) => {
  console.log(req.url);
  switch (req.url) {
    case '/1.html':
      res.write('1.html');
      break;

    case '/2.html':
      res.write('2.html');
      break;
    default:
      res.write('404');
      break;
  }

  res.end();
});

// 监听端口
server.listen(5000);
复制代码

我们直接改造一下这个,请求文件的时候直接从一个文件夹内去找,找到了给你,找不到就直接返回404 既然如此,我们能够看一下 asmp是怎么作的,他就是把这些文件放到www目录的,好的,那我们也来建一个www 名字随便,习惯而已 稍微缕一缕思路

  • // req.url => 'index.html'
  • // 读取=> './www/index.html'
  • // './www' + req.url

好的,有了这个思想,我们改造一下这个代码

const http = require('http');
const fs = require('fs');

let server = http.createServer((req, res) => {
  if (req.url == '/favicon.ico') {
    return;
  }
  let file_name = './www' + req.url;
  console.log(file_name);
  fs.readFile(file_name, (err, data) => {
    if (err) {
      res.write('404');
    } else {
      res.write(data);
    }

    res.end();
  });
});

server.listen(5000);

复制代码

而后www下随便建两个index.html,甚至放点图片或者视频

image.png

测试结果

http://localhost:5000/index.html image.png

http://localhost:5000/2.html image.png

http://localhost:5000/0.png

image.png

总结

到这为止已经能够直接返回静态文件了,可是这对服务器来讲仍是远远不够的,由于最起码的请求处理什么get、post 上传文件视频什么的,我们下篇文章就来讲一说数据get请求处理

有什么感兴趣的,或者遇到什么问题能够直接加我好友,我们一块儿沟通

微信:Dyy916829411 qq: 916829411

相关文章
相关标签/搜索