Node.js API快速入門
Node.js API 快速入門
一、事件EventEmitter
const EventEmitter = require('events'); class MyEmitter extends EventEmitter{} const eventEmitter = new MyEmitter(); //設定連結事件監聽器 eventEmitter.on('connection', (url) => { console.log(`連結 ${url} 成功!`); eventEmitter.emit('data_received', '神祕程式碼'); });//資料接收監聽器 eventEmitter.on('data_received', (data) => { console.log(`資料 ${data} 接收成功!`); }); //觸發連結事件 eventEmitter.emit('connection', 'Google'); console.log('任務完成!'); /*連結 Google 成功! 據 神祕程式碼 接收成功! 任務完成!*/
二、二進位制快取Buffer
JavaScript 語言自身只有字串資料型別,沒有二進位制資料型別。
但在處理像TCP流或檔案流時,必須使用到二進位制資料。因此在 Node.js中,
定義了一個 Buffer 類,該類用來建立一個專門存放二進位制資料的快取區。
在 Node.js 中,Buffer 類是隨 Node 核心一起釋出的核心庫。
原始資料儲存在 Buffer 類的例項中。一個 Buffer 類似於一個整數陣列,
但它對應於 V8 堆記憶體之外的一塊原始記憶體。
//建立一個長度為512,且用0填充的Buffer let buf = Buffer.alloc(512); //緩衝區長度 console.log(buf.length); //512 //向緩衝區寫入字串,預設使用utf-8編碼//返回實際寫入的大小,如果快取區空間不足,只會寫入一部分 let len = buf.write('寫入了一些東西'); console.log(`寫入位元組數: ${len}`); //21 //從快取區讀取資料 console.log(buf.toString('base64', 0, 12)); //5YaZ5YWl5LqG5LiA
三、流Stream
Stream 是一個抽象介面,Node.js,Stream 有四種流型別:
-
Readable - 可讀操作
-
Writable - 可寫操作
-
Duplex - 可讀可寫操作
-
Transform - 操作被寫入資料,然後讀出結果
所有的 Stream 物件都是 EventEmitter 的例項。常用的事件有:
-
data - 當有資料可讀時觸發。
-
end - 沒有更多的資料可讀時觸發。
-
error - 在接收和寫入過程中發生錯誤時觸發。
-
finish - 所有資料已被寫入到底層系統時觸發。
讀取和寫入:
const fs = require('fs'); let data = ''; let inputData = 'What\'s the matter with you. Say me something new.'; //建立可讀流 let readerStream = fs.createReadStream('sth.txt'); readerStream.setEncoding('UTF8'); //處理流事件 readerStream.on('data', (buf) => { data += buf; }); readerStream.on('end', () => { console.log(data); }); readerStream.on('error', (err) => { console.log(err.stack); }); console.log('讀出完畢??????'); /* 程式執行完畢! I have a orange.*/ let writerStream = fs.createWriteStream('output.txt'); writerStream.write(data, 'UTF8'); //標記檔案末尾 writerStream.end(); //處理流事件 writerStream.on('finish', () => { console.log('寫入完成!'); }); writerStream.on('error', (err) => { console.log(err.stack); }); console.log('寫入完畢?????'); /* 讀出完畢?????? 寫入完畢????? 寫入完成! I have a orange.*/
管道流:
管道提供了一個輸出流到輸入流的機制。通常我們用於從一個流中獲取資料並將資料傳遞到另外一個流中。
const fs = require('fs'); let reader = fs.createReadStream('sth.txt'); //如果沒有input.txt會建立 let writer = fs.createWriteStream('input.txt'); //讀取sth.txt的內容寫入到input.txt中去 reader.pipe(writer);
鏈式流:
鏈式是通過連線輸出流到另外一個流並建立多個流操作鏈的機制。鏈式流一般用於管道操作。
接下來我們就是用管道和鏈式來壓縮和解壓檔案。建立 compress.js 檔案, 程式碼如下:
const fs = require('fs'); const zlib = require('zlib'); //壓縮檔案 fs.createReadStream('input.txt') .pipe(zlib.createGzip()) .pipe(fs.createWriteStream('input.txt.gz')); console.log('檔案壓縮完成'); // 解壓 input.txt.gz 檔案為 input.txt fs.createReadStream('input.txt.gz') .pipe(zlib.createGunzip()) .pipe(fs.createWriteStream('input.txt')); console.log("檔案解壓完成。");
四、全域性物件
在瀏覽器 JavaScript 中,通常 window 是全域性物件, 而 Node.js 中的全域性物件是 global,
所有全域性變數(除了 global 本身以外)都是 global 物件的屬性。
具體API略
五、檔案系統---fs模組
Node.js 檔案系統(fs 模組)模組中的方法均有非同步和同步版本,例如讀取檔案內容的函式有非同步的 fs.readFile()
和同步的 fs.readFileSync()。非同步的方法函式最後一個引數為回撥函式,回撥函式的第一個引數包含了錯誤資訊(error)。
建議大家使用非同步方法,比起同步,非同步方法效能更高,速度更快,而且沒有阻塞。