JS高階--node.js內建模組
學習任何語言,檔案的操作和目錄的操作
檔案的寫入
const fs = require('fs'); fs.writeFile('檔名','寫入的內容',回撥函式)
檔案的追加
fs.appendFile('檔名','增加的內容',回撥函式)
檔案的讀取
fs.readFile(檔名,回撥函式)
檔案的複製
最早的時候,檔案的複製,官方沒有提供 api,但是我們也能夠實現
實現的思路就是先讀後寫
const fs = require('fs'); fs.readFile('./test.txt',(err,data)=>{ if(err) throw err; fs.writeFile('./F71.txt',data,(error)=>{ if(error) throw error; }) })
但是現在,官方已經提供了檔案複製的 api
const fs = require('fs'); fs.copyFile('./test.txt','./F72.txt',(err,data)=>{ if(err) throw err; })
獲取檔案資訊
通過 fs 模組的 stat 方法(status),就可以拿到一個檔案的具體資訊:
const fs = require('fs'); fs.stat('./test.txt',(err,status)=>{ if(err) throw err; console.log(status); })
有兩個方法比較常用:
-
isFile:是否是檔案
-
isDirectory:是否為目錄
刪除檔案
const fs = require('fs'); fs.unlink('./F72.txt',()=>{});
目錄相關的處理
建立目錄
const fs = require('fs'); fs.mkdir(目錄名,()=>{})
讀取目錄
fs.readdir(目錄名,回撥函式)
讀取一個目錄下面的所有檔案:
const fs = require('fs'); const path = require('path'); // join 方法使用示例:path.join('a','b') ----> a/b/ // 該函式就可以讀取所有的檔案 function showFile(dir) { // 首先,通過 readdir 這個方法來讀取目錄 fs.readdir(dir, (err, data) => { if (err) throw err; data.forEach(item => { // 下一步就是判斷這個 item 是否為檔案 let fileDir = path.join(dir, item); fs.stat(fileDir, (err, status) => { if (status.isFile()) { // 進入此分支,說明當前是一個檔案 console.log(item); } else { showFile(fileDir); } }) }) }) } showFile('./F71')
刪除目錄的 api(目錄為空才能刪除)
fs.rmdir(目錄名,回撥函式)
刪除目錄同步版
const fs = require('fs'); const path = require('path'); const delDir = (dir) => { // 判斷目錄是否存在 if (fs.existsSync(dir)) { // 獲取到該目錄下的所有內容,返回的是一個數組 const files = fs.readdirSync(dir); // 遍歷該陣列,如果是目錄,遞迴進去;如果是檔案,直接刪除掉 files.forEach(function (file, index) { const curPath = path.join(dir, file); // 獲取絕對路徑 if (fs.statSync(curPath).isDirectory()) { delDir(curPath); // 因為是目錄,所以再次遞迴進去 } else { fs.unlinkSync(curPath); // 刪除檔案 } }); // 陣列遍歷完之後,該目錄已經變成了一個空目錄,將此目錄刪除掉 fs.rmdirSync(dir); } } delDir('./test');
HTTP 模組
快速入門示例:
const http = require('http'); http.createServer((req,res)=>{ // 這個回撥函式中的 req 代表 http 請求 // res 代表 http 響應 res.writeHead(200,{ 'Content-type' : 'text/html;charset=utf-8' }); res.write(` <h1>歡迎學習 nodejs</h1> <p>這是通過 node伺服器訪問到的頁面</p> `); res.end(` <p>這一次連線已經結束~</p> `); // 結束這一次響應 }).listen(3000,()=>{ console.log('伺服器已經啟動...') });
獲取 get 請求和 post 請求的資料
get 請求,資料都是在 URL 後面,所以我們獲取到 URL,就等價於獲取到了客戶端給我傳遞的資料
const http = require('http'); const url = require('url'); // http://www.f71.com/index.html?name=xiejie&age=18 http.createServer((req,res)=>{ const params = url.parse(req.url, true).query; console.log(params); }).listen(3000,()=>{ console.log('伺服器已經啟動...') });
post 請求,資料是在請求體裡面,所以我們需要從請求體裡面去拿資料,只有通過事件監聽的方式來拿
const http = require('http'); const url = require('url'); let str = ` <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <form action="" method="POST"> <div> 使用者名稱:<input type="text" name="username" id="username"> </div> <div> 密碼: <input type="password" name="userPWD" id="userPWD"> </div> <button>提交</button> </form> </body> </html> ` http.createServer((req,res)=>{ let body = ''; // 用來裝請求體裡面的資料 // 每一次有資料到達伺服器,都會觸發 data 事件 req.on('data',function(chunk){ body += chunk; }) // 當觸發 end 事件的時候,說明資料已經接收完畢 req.on('end',function(){ res.writeHead(200,{ 'Content-type' : 'text/html;charset=utf-8' }); if(body){ res.end(`已經接收到你輸入的內容:${body}`); } else { res.end(str); } }) }).listen(3000,()=>{ console.log('伺服器已經啟動...') });
const https = require('https'); const cheerio = require('cheerio'); // 爬蟲的思路很簡單,就是在伺服器端通過 http.get 方法來發送請求 https.get('https://tuijian.hao123.com/hotrank',(req)=>{ let data = ''; // 獲取資料 req.on('data',(chunk)=>{ data += chunk }); req.on('end',()=>{ filter(data); }) }); // 對資料進行提取 function filter(data){ let result = []; // 用於存放篩選後的資料 const $ = cheerio.load(data); // 這個時候它就會生成一個 jquery 物件,我們就可以使用 jquery 的方法來篩選資料 const arr = $('[monkey="ss"]').find('.point-bd').find('.point-title') arr.each((index,item)=>{ result.push($(item).text()); }) console.log(result); }
Buffer 模組和 Stream 模組
Buffer 是一個緩衝區,最早的時候,我們的 JavaScript 只能處理字串,不能夠處理二進位制資料
Buffer 相當於是在計算機記憶體裡面開闢了一個記憶體空間,示例:
let buf = new Buffer.alloc(5); console.log(buf); // <Buffer 00 00 00 00 00>
既然建立的這個 buffer 是一段記憶體空間,那麼我們可以往這個空間裡面寫入資料
let buf = new Buffer.alloc(5); buf.write('abcd'); console.log(buf);
Stream 檔案流
流的概念
所謂流,就是像水流一樣,資料都是二進位制,所以在傳輸的時候,需要一點一點的流過來。比如我們在網路上看電影,下載電影,都是以流的形式,一點一點傳輸過來的。
在 nodejs 裡面,我們就可以操作流
-
可讀流
-
可寫流
首先有幾個事件:
-
data:只要可讀流還存在資料,就會觸發 data
-
end :要操作的流已經沒有資料,就會觸發 end
-
error:發生錯誤的時候,會觸發 error 事件
pipe 方法
使用 pipe 方法,在處理大檔案的時候,非常的方便,相當於在兩個流檔案直接建立了一個管道
檔案壓縮
在做 web 開發的時候,我們有時會進行效能優化,其中一條就包含檔案壓縮。
具體包含以下幾個步驟:
(1)在瀏覽器傳送 http 請求的時候,請求頭裡面會有一個鍵值對,其中有一個鍵值是 Accept-Encoding,表示我這個瀏覽器能夠接受的編碼格式,如果包含 gzip,說明這個瀏覽器支援壓縮檔案的解析。
(2)nodejs中對檔案進行壓縮