前沿:核心模組二主要是和流相關的部分,當然要想給這一塊有清楚的瞭解,你需要對核心模組(一)中的內容有一些瞭解。
fs模組
fs模組的常見方法(所有的讀方法,檔案必須存在,不存在就會報錯,所有的寫方法,如果檔案不存在,則建立該檔案):
- 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);
複製程式碼
- 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`);
複製程式碼
- fs.appendFile()
const fs=require(`fs`);
//writeFile flags=w 寫入,如果檔案已經存在,則刪除掉檔案後再寫入
//fs.writeFile(`./4.txt`,`789`,{flag:`a`});
//給檔案追加內容,不會覆蓋原有內容
fs.appendFile(`./4.txt`,`789`);
複製程式碼
以上三個方法的弊端:都是將檔案整體讀出或者寫入。
- fs.open()
fs.open(src, `r`, (err,fd)) //第一個參數列示檔案,第二個表示什麼方式(r, r+, w, w+, a, a+), 第三個是回撥,其中 fd是檔案描述符
複製程式碼
- 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());
});
複製程式碼
- 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(`關閉檔案`);
});
});
});
複製程式碼
-
fs.createReadStream()
-
fs.fsync()
-
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 時,則會返回 false。
if (!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
複製程式碼
- 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
})
複製程式碼
- fs.access() 檔案是否存在
let fs = require(`fs`);
fs.access(`./1.txt`, (err) => {
console.log(err)
})
複製程式碼
- fs.mkdir()
//建立目錄 建立目錄的時候一定要注意 父目錄一定要存在
let fs = require(`fs`);
fs.mkdir(`./a/b`, (err) => { //如果a目錄不存在 則會報錯
console.log(err)
})
複製程式碼
- 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的常用核心模組的一部分,因為涉及的內容比較多並沒有深入進去,其實每個部分都可以展開裡面有很多知識,很多深入的知識我本人也不是很瞭解,希望上面的一些核心內容能夠幫助到你,當然有很多不足之處希望朋友們提出指正。也希望和各位朋友一起學習分享!
後記:
本文涉及到的流更加深入一點的可以看
相關內容: