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的子類:
- Javascript的物件機制基於原型,支援部分多重繼承,繼承EventEmitter不會打亂物件原來的關係
緩衝區:
1、相關知識
Javascript語言只有字串資料型別沒有二進位制資料型別,因此,為了處理TCP/檔案流,Node.js定義了Buffer類。Buffer類可以用來建立一個存放二進位制資料的緩衝區。Buffer類的例項類似一個整數陣列,對應的是V8堆記憶體之外的原始記憶體。
建立Buffer:
V6.0之前使用new Buffer進行建立(操作許可權較大),V6.0之後建議使用buffer.from()介面建立Buffer類
- Buffer.alloc(size[, fill[, encoding]])
返回一個指定大小的 Buffer 例項,如果沒有設定 fill,則預設填滿 0
- Buffer.allocUnsafe(size)
返回一個指定大小的 Buffer 例項,但是它不會被初始化,所以它可能包含敏感的資料
- Buffer.allocUnsafeSlow(size)
- Buffer.from(array)
返回一個被 array 的值初始化的新的 Buffer 例項(傳入的 array 的元素只能是數字,不然就會自動被0覆蓋)
- Buffer.from(arrayBuffer[, byteOffset[, length]])
返回一個新建的與給定的 ArrayBuffer 共享同一記憶體的 Buffer。
- Buffer.from(buffer)
複製傳入的 Buffer 例項的資料,並返回一個新的 Buffer 例項
- 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:一個javascript值,通常是被轉換的一個物件或者是陣列
- 引數2:轉換的方法
- 引數3:間隔符號,使返回結果更容易讀
注:是ES6中新增的語法
(x) => x + 6
相當於
function(x){
return x + 6;
};
JSON.parse(text: string, reviver?: (key: any, value: any) => any): any;
將資料轉換成javascript物件
- JSON字串
- 轉換結果的函式【可選】
例項:
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);
執行結果如下: