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

相關文章
相關標籤/搜索