1. 程式人生 > >nodeJs學習——error事件/緩衝區的操作

nodeJs學習——error事件/緩衝區的操作

什麼是error事件?

EventEmitter定義的特殊的時間,包含錯誤語義,當遇到異常時會觸發error時間,如果沒有對應的異常監聽器,那麼Node.js會把它當做異常,退出程式並輸出錯誤資訊。

 

例如:

 

 

var ee = new events.EventEmitter();
ee.addListener('error',function () {
   console.log("you need to deal with this error");
});
ee.emit('r');

 

執行結果如下:

雖然時間r我並沒人為地進行監聽,但執行時沒有報錯

 

var events = require('events');
var ee = new events.EventEmitter();
ee.addListener('error',function () {
   console.log("you need to deal with this error");
});
ee.emit('error');

 

執行結果

這個名為‘error’的事件會報錯,為了避免因為error事件的錯發而報錯,我們可以增加error的監聽器


EventEmitter的繼承:

所有支援事件相應的核心模組都是EventEmitter的子類:

  1. Javascript的物件機制基於原型,支援部分多重繼承,繼承EventEmitter不會打亂物件原來的關係

 



緩衝區:

       1、相關知識

              Javascript語言只有字串資料型別沒有二進位制資料型別,因此,為了處理TCP/檔案流,Node.js定義了Buffer類。Buffer類可以用來建立一個存放二進位制資料的緩衝區。Buffer類的例項類似一個整數陣列,對應的是V8堆記憶體之外的原始記憶體。

 

              建立Buffer:

              V6.0之前使用new Buffer進行建立(操作許可權較大),V6.0之後建議使用buffer.from()介面建立Buffer類

 

  1. Buffer.alloc(size[, fill[, encoding]])

返回一個指定大小的 Buffer 例項,如果沒有設定 fill,則預設填滿 0

  1. Buffer.allocUnsafe(size)

返回一個指定大小的 Buffer 例項,但是它不會被初始化,所以它可能包含敏感的資料

  1. Buffer.allocUnsafeSlow(size)
  2.  Buffer.from(array)

返回一個被 array 的值初始化的新的 Buffer 例項(傳入的 array 的元素只能是數字,不然就會自動被0覆蓋)

  1. Buffer.from(arrayBuffer[, byteOffset[, length]])

返回一個新建的與給定的 ArrayBuffer 共享同一記憶體的 Buffer。

  1. Buffer.from(buffer)

複製傳入的 Buffer 例項的資料,並返回一個新的 Buffer 例項

  1. Buffer.from(string[, encoding])

返回一個被 string 的值初始化的新的 Buffer 例項

 

 

       2、字元編碼

              通過使用顯示字串編碼,實現Buffer例項與javascript字串之間的相互轉換

                    

              例如:


const buf = Buffer.from('hello world','ascii');
console.log(buf.toString('utf-8'));
console.log(buf.toString('UCS2'));

 

                     執行結果如下:

 

                     原始碼分析

                     Buffer.from = function(param1, param2, param3){

};

該方法實現建立一個Buffer例項

==>第一個引數為緩衝區或者陣列(非必須填)

==>第二個引數型別為(字串/ int型)

          字串設定編碼方式/int型設定第一個放置的陣列位置的下標(僅針對ArrayBuffer型別)

==>第三個引數為int型,如果不設定預設為從該下標到陣列最後位置的空間

返回一個緩衝區例項

 

 

Buffer.prototype.toString = function(encoding, start, end) {
    return '';
};

將二進位制資料按照一定型別轉換成字串

==>第一個引數為編碼方式(預設編碼方式為utf8)

==>第二個引數讀取位元組的起始位置

==>第三個引數決定讀取的終止位置,預設為緩衝區結尾

如果緩衝區沒有資料返回空,否則返回編碼後的字串

 

 

支援字元編碼

                    

ascii 

僅支援 7 位 ASCII 資料。如果設定去掉高位的話,這種編碼是非常快的。

utf8

多位元組編碼的 Unicode 字元。許多網頁和其他文件格式都使用 UTF-8 

utf16le 

2 或 4 個位元組,小位元組序編碼的 Unicode 字元。支援代理對(U+10000 至 U+10FFFF)

ucs2 - utf16le

utf16le 的別名。

base64 

Base64 編碼。

latin1

 一種把 Buffer 編碼成一位元組編碼的字串的方式。

binary

latin1 的別名。

hex

將每個位元組編碼為兩個十六進位制字元。

 

                     讀寫操作

                            寫入:

                                  buf.write(string[, offset[, length]][, encoding])

                                    String-寫入緩衝區的字串

                                                緩衝區開始寫入的索引值

                                                寫入的位元組數,預設為緩衝區的總大小

                                                使用的編碼,預設utf8

                                                返回實際寫入字元個數

 

注:如果字串的大小大於緩衝區的大小,只盡量寫滿所有空間(如果最後一個字元不能完整寫入則不寫)

             

                                   例項:

 

buf = Buffer.alloc(256);
len = buf.write("hello sunshine");
console.log(len);

                                   執行結果:

                                  

                            讀取資料:

buf.toString([encoding[, start[, end]]])

 

                                  

                                   例項:

buf = Buffer.alloc(256);
for(var i = 0; i < 26; i++){
    buf[ i ] = i+ 97;
}

console.log(buf.toString('utf-8'));

                    

                                   執行結果如下:

                                  

 

 

                     Buffer轉換成JSON物件

buf.toJSON()

JSON.stringify()方法將JavaScript物件轉換成JSON字串,在呼叫JSON.stringify()方法時,會隱式地呼叫toJSON()

 

       stringify(value: any, replacer?: (key: string, value: any) => any, space?: string | number): string;

  1. 引數1:一個javascript值,通常是被轉換的一個物件或者是陣列
  2. 引數2:轉換的方法
  3. 引數3:間隔符號,使返回結果更容易讀

 

注:是ES6中新增的語法

(x) => x + 6

相當於

        function(x){

        return x + 6;

        };

 

 

 

        JSON.parse(text: string, reviver?: (key: any, value: any) => any): any;

將資料轉換成javascript物件

  1. JSON字串
  2. 轉換結果的函式【可選】

 

例項:

const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
const json = JSON.stringify(buf);

console.log(json);
console.log(JSON.parse(json));


const result = JSON.parse(json,(key,value) =>{
   return value && value.type === 'Buffer' ?
       Buffer.from(value.data):
    value;
});

console.log(result);

            執行結果如下: