帶你一起擼一遍 nodejs 常用核心模組(二)

xlei1123發表於2019-03-03

前沿:核心模組二主要是和流相關的部分,當然要想給這一塊有清楚的瞭解,你需要對核心模組(一)中的內容有一些瞭解。

fs模組

fs模組的常見方法(所有的讀方法,檔案必須存在,不存在就會報錯,所有的寫方法,如果檔案不存在,則建立該檔案):

  1. fs.readFile() — fs.readFileSync()
let fs=require(`fs`);
//是把整個檔案作為一個整體
fs.readFile(`./1.txt`,{encoding:`utf8`},function (err,data) {
	console.log(err);
	console.log(data);
});
//同步方法是沒有回撥函式的
let result=fs.readFileSync(`./1.txt`,{encoding: `utf8`});
console.log(result);
複製程式碼
  1. fs.writeFile() —fs.weiteFileSync()
const fs=require(`fs`);
//會覆蓋檔案原有內容
//fs.writeFile(`./2.txt`,`123`,{encoding: `utf8`},(err) => {
//	console.log(`write OK`);
//})
fs.writeFileSync(`./3.txt`,`456`);
複製程式碼
  1. fs.appendFile()
const fs=require(`fs`);
//writeFile flags=w 寫入,如果檔案已經存在,則刪除掉檔案後再寫入
//fs.writeFile(`./4.txt`,`789`,{flag:`a`});
//給檔案追加內容,不會覆蓋原有內容
fs.appendFile(`./4.txt`,`789`);
複製程式碼

以上三個方法的弊端:都是將檔案整體讀出或者寫入。

  1. fs.open()
fs.open(src, `r`, (err,fd))    //第一個參數列示檔案,第二個表示什麼方式(r, r+, w, w+, a, a+), 第三個是回撥,其中 fd是檔案描述符
複製程式碼
  1. fs.read() //將內容放到記憶體中
let buffer=Buffer.alloc(6);//[0,1,2,3,4,5]
fs.read(fd,buffer,0,3,3,(err,bytesRead) => {   //檔案描述符,buffer,buffer0的位置,buffer的長度,檔案讀取的位置,
//回撥 bytesRead表示實際位元組
    console.log(buffer.toString());
});
複製程式碼
  1. fs.write()
let buffer=Buffer.from(`天天向上`);//[0,1,2,3,4,5,6,7,8,9,10,11]
//fd buffer offset
fs.write(fd,buffer,3,6,3,(err,bytesWritten) => { //檔案描述符,buffer,buffer起始位置,buffer長度,檔案寫入位置,
//回撥 bytesWritten表示實際位元組
	console.log(err);
	fs.fsync(fd,(err) => {
		fs.close(fd,(err) => {
			console.log(`關閉檔案`);
		});
	});
});
複製程式碼
  1. fs.createReadStream()

  2. fs.fsync()

  3. fs.createWriteStream()

來一個小例子,有助於理解

// pipe
let fs = require(`fs`);
let rs = fs.createReadStream(`./1.txt`,{
    highWaterMark:1
})
let ws = fs.createWriteStream(`./5.txt`,{
    highWaterMark:2
})
let index = 1;
rs.on(`data`, (data) => {
    console.log(index++)
    let flag = ws.write(data);    // 當內部的可寫緩衝的總大小小於 highWaterMark 設定的閾值時,
    //呼叫 writable.write() 會返回 true。 一旦內部緩衝的大小達到或超過 highWaterMark 時,則會返回 falseif (!flag) {     //內部緩衝超過highWaterMark
        rs.pause()
    }
})
let wsIndex = 1;
ws.on(`drain`, () => {
    console.log(`ws`+wsIndex++)
    rs.resume()
})
// 1 2 ws1 3 4 ws2 5 6 ws3
複製程式碼
  1. fs.stat()
//讀取檔案的狀態;不建議在呼叫 fs.open() 、fs.readFile() 或 fs.writeFile() 之前使用 fs.stat() 檢查一個檔案是否存在。
//作為替代,使用者程式碼應該直接開啟/讀取/寫入檔案,當檔案無效時再處理錯誤。
 //如果要檢查一個檔案是否存在且不操作它,推薦使用 fs.access()。
 let fs = require(`fs`);
fs.stat(`./1.txt`, (err, data) => {
    console.log(data)    //列舉幾個常用的屬性 size,ctime,birthtime,mtime
})
複製程式碼
  1. fs.access() 檔案是否存在
let fs = require(`fs`);
fs.access(`./1.txt`, (err) => {
    console.log(err)
})
複製程式碼
  1. fs.mkdir()
//建立目錄 建立目錄的時候一定要注意 父目錄一定要存在
let fs = require(`fs`);
fs.mkdir(`./a/b`, (err) => {   //如果a目錄不存在 則會報錯
    console.log(err)
})
複製程式碼
  1. fs.rmdir()
//刪除目錄 同理 如果a目錄不是空的,需要刪除a裡面的從裡面往外一層一層刪除,否則報錯,directory not empty
let fs = require(`fs`);
fs.rmdir(`./a`, (err) => {
    console.log(err)
})
複製程式碼

TCP模組

//傳輸層 http websocket都是基於tcp tcp是一個可讀可寫流

// 傳輸層  http websocket (應用起來基本一樣)
let net = require(`net`);

// 套接字
let server = net.createServer();
// 連結時會執行此方法,每次連結都會產產生一個socket物件
// http規定的頭 設定一些頭
// socket是一個可讀可寫的流 Duplex
server.on(`connection`,function(socket){
    // socket 沒有規則 我們可以用tcp 模擬http
    socket.setEncoding(`utf8`);
    socket.on(`data`,function(data){
        console.log(data);
    });
    //模擬
    socket.write(`
HTTP/1.1 200 ok
Content-Length: 5

hello
    `);
});
server.listen(3000);
//當我們開啟瀏覽器 localhost:3000時 可以看到hello
複製程式碼

http模組

//常見用法
var http=require("http");

http.createServer(function(req,res){
    res.writeHead(200,{
        "content-type":"text/plain"
    });
    res.write("hello nodejs");
    res.end();
}).listen(3000);
//在瀏覽器中輸入 localhost:3000 我們可以看到hello nodejs
複製程式碼

以上就是nodejs的常用核心模組的一部分,因為涉及的內容比較多並沒有深入進去,其實每個部分都可以展開裡面有很多知識,很多深入的知識我本人也不是很瞭解,希望上面的一些核心內容能夠幫助到你,當然有很多不足之處希望朋友們提出指正。也希望和各位朋友一起學習分享!

後記:

本文涉及到的流更加深入一點的可以看

相關內容:

相關文章