這是我發佈的有關Nodejs學習的第二篇博客,這篇主要介紹Nodejs一些常用的api,還有一些小慄子可以更直觀的瞭解。 ...
Nodejs基礎api
1、path
path模塊提供了很多實用的工具函數,用於處理文件與目錄的路徑,下麵是它的api:
- normalize 方法可以輸出規範格式的path字元串
- join 方法用於拼接path字元串
- resolve 方法用於將相對路徑解析為絕對路徑
- name 方法用於查看文件名
- basename查看文件名
- dirname查看所在路徑
- extname查看擴展名
- parse與format,parse用於將一個路徑字元串返回成一個對象,而format則正好相反,如果有時候你需要修改一個路徑的話,就可以先parse修改之後再format回去
delimiter 提供不同系統下的分隔符,windows系統(;)和posix(:)系統分隔符不同。sep 返回各平臺的分隔符(Windows,POSIX/)
//delimiter
console.log(process.env.PATH)
'C:\Windows\system32;C:\Windows;C:\Program Files\node'process.env.PATH.split(path.delimiter)
['C:\Windows\system32', 'C:\Windows', 'C:\Program Files\node\']//sep
'foo\bar\baz'.split(path.sep)
返回:['foo','bar','baz']
path路徑需要註意的一些地方
- _dirname、_filename總是返迴文件的絕對路徑
- process.cwd( )總是返回執行node命令所在文件夾
2、Buffer(緩衝)
Buffer是global對象的屬性,用於處理二進位數據流。它的實例類似整數數組,但是它裡面是一些0-255的數字(預設用十六進位表示)大小固定。且用C++代碼在V8堆外分配物理記憶體
如何實例化Buffer:
- Buffer.alloc( length ) or Buffer.alloc( length,1 )
- Buffer.allocUnsafe( length ) // 它較於alloc的區別是沒做初始化,這樣速度快,但記憶體塊原來有的東西沒清空,所以要用fill( )於write( )把裡面的內容重寫一下
- Buffer.from( [1,2,3] ) or Buffer.form( 字元串 , 編碼格式)
以下是它的類的一些常用方法:
- Buffer.byteLength 返回一個字元串的實際位元組長度
- Buffer.isBuffer( ) 判斷是否時buffer對象
- Buffer.concat( ) 拼接buffer,傳入的參數是一個數組
再看下實例的屬性
- buf.length 返回 buf 在位元組數上分配的記憶體量
- buf.toString( ) 根據指定的字元編碼解碼 buf 成一個字元串
- buf.fill( ) 用於填充buf
- buf.equals( ) 比較兩個buf的內容是否一樣
- buf.indexOf( ) 用於查找匹配
- buf.copy( )
3、event
Nodejs所有能觸發事件的對象都是EventEmitter類的實例,這些對象開放了一個 eventEmitter.on() 函數,允許將一個或多個函數綁定到會被對象觸發的命名事件上。
eventEmitter.on() 方法用於註冊監聽器,eventEmitter.emit() 方法用於觸發事件。
const EventEmiter = require('events');
class triggerEvent extends EventEmiter {}
const ex = new triggerEvent();//實例化
ex.on("error",(err,time) => {
console.log(err);
console.log(time)
});//事件綁定
ex.emit("err",new Error("opps!"),Date.now());//手動觸發事件,並傳兩個參數
Nodejs事件的綁定還可以用once進行綁定,讓事件只觸發一次。
而事件可以通過removeListener(event name,function name)進行移除,或者使用removeAllListeners(event name)移除所有
4、fs(文件系統)
fs 模塊提供了一些 API,用於以一種類似標準 POSIX 函數的方式與文件系統進行交互。
所有的文件系統操作都有非同步和同步兩種形式。
非同步形式的最後一個參數都是完成時回調函數。 傳給回調函數的參數取決於具體方法,但回調函數的第一個參數都會保留給異常。
- fs.readFile( ) 讀取文件
const fs = require("fs");
fs.readFile("./event.js",'utf8',(err,data) => {
if(err) {
throw err;
} else {
console.log(data);
}
})//非同步讀取文件
const data = fs.readFileSync("./event.js",'utf-8');//同步讀取文件
console.log(data);
- fs.writeFile( ) 寫入文件
const fs = require("fs");
const content = Buffer.from("balabalabala");
fs.writeFile("./text",content,err => {
if(err){
throw err;
} else {
console.log("done !");
}
})
- fs.stat( ) 輸出文件的stats屬性
const fs = require("fs");
fs.stat("stat.js", (err,stats) => {
if(err) {
console.log("文件不存在!");
return;
} else {
console.log(stats.isFile());//是否為文件
console.log(stats.isDirectory());//是否為文件夾
}
})
- fs.watch( ) 監視文件或者文件夾
const fs = require("fs");
fs.watch('./',{
recursive: true //指明是否全部子目錄應該被監視,或只是當前目錄。
},(eventType,filename) => {
console.log("變化類型",eventType);
console.log("變化的文件名",filename);
})
- fs.createReadStream( ) 創建數據流,讀取數據
數據是一點點流動的,不是全部接受,相較於fs.readFile( )
會顯得更加優雅
const fs = require("fs");
const rs = fs.createReadStream('./readstream.js');
rs.pipe(process.stdout);//數據導向哪裡,stdout就是控制台
- fs.createWriteStream( ) 創建數據流,寫入數據
同fs.createReadStream( )
,它是一種優雅的寫入數據的方式
const fs = require("fs");
const ws = fs.createWriteStream('./test.txt');
const timer = setInterval(() => {
const num = parseInt(Math.random() * 10);//取19以內的隨機數
if(num < 8){
ws.write(num + '');//轉換為字元串,因為只能寫入buffer或者字元串
} else {
clearInterval(timer);//清楚定時器
ws.end();//結束寫入數據流
}
},1000);//每個一秒寫入一段數據
ws.on("finish",() => {
console.log("done!");
});//監聽事件結束
下麵還有一些常用的api:
- fs.rename( ) 修改文件名
- fs.unlink( ) 刪除文件
- fs.readdir( ) 讀取文件夾下的所有文件名
- fs.mkdir( ) 創建文件夾
- fs.rmdir( ) 刪除文件夾