1. 程式人生 > >Node.js API快速入門

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)。

建議大家使用非同步方法,比起同步,非同步方法效能更高,速度更快,而且沒有阻塞。