1. 程式人生 > 實用技巧 >JS高階--node.js內建模組

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 模組

在 nodejs 中,提供了一個內建的 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 請求

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('伺服器已經啟動...')
});

  

使用 http 模組 get 方法來做一個簡單的爬蟲
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中對檔案進行壓縮