stream
TARS 框架的編解碼工具
結(jié)構(gòu)體的使用示例
我們演示結(jié)構(gòu)體在三個(gè)典型場(chǎng)景的使用方法:
第一種場(chǎng)景:當(dāng)結(jié)構(gòu)體用作RPC函數(shù)的參數(shù)時(shí)矛物。
由于rpc框架會(huì)自動(dòng)對(duì)參數(shù)進(jìn)行序列化茫死,所以我們無(wú)需關(guān)心編解碼,只需要按照普通的類一樣泽谨,先new后賦值璧榄,然后傳入?yún)?shù)直接調(diào)用RPC函數(shù)即可。
假如服務(wù)端有個(gè)RPC如下定義:
module TRom
{
struct param {
0 optional string sUserName;
1 optional int iId;
};
interface process {
int getUserLevel(Param userInfo, out int iLevel);
};
};
安裝上述方法生成tars編解碼文件(生成文件名稱為:Protocol.js)之后吧雹,按照如下方法調(diào)用對(duì)端服務(wù)。
var Tars = require("@tars/rpc").client;
var TRom = require("./Protocol.js").TRom;
var prx = Tars.stringToProxy(TRom.NodeJsCommProxy, "TRom.NodeJsTestServer.NodeJsCommObj@tcp -h 10.12.22.13 -p 8080 -t 60000");
var usr = new TRom.Param();
usr.sUserName = "KevinTian";
usr.iId = 10000;
prx.getUserLevel(usr).then(function (result) {
console.log("success:", result);
}, function (result) {
console.log("error:", result);
}).done();
第二種場(chǎng)景:對(duì)端非標(biāo)準(zhǔn)rpc框架涂身,接受序列化的數(shù)據(jù)流作為參數(shù)雄卷。
在這種場(chǎng)景下需要我們隊(duì)結(jié)構(gòu)體進(jìn)行序列化。還是以上面的tars文件作為例子蛤售,一般的方法如下:
// 客戶端安裝如下方法進(jìn)行打包丁鹉,然后將打包后的二進(jìn)制數(shù)據(jù)發(fā)送到服務(wù)端
var Tars = require("@tars/stream");
var TRom = require("./Protocol.js").TRom;
var usr = new TRom.Param();
usr.sUserName = "KevinTian";
usr.iId = 10000;
var os = new Tars.OutputStream();
os.writeStruct(1, usr);
// 打包并得到發(fā)送的二進(jìn)制數(shù)據(jù)流
var toSendBuffer = os.getBinBuffer().toNodeBuffer();
客戶端將toSendBuffer發(fā)送給服務(wù)端,并且服務(wù)端接受完畢之后按如下方法進(jìn)行解碼:
var Tars = require("@tars/stream");
var TRom = require("./Protocol.js").TRom;
var is = new Tars.InputStream(new Tars.BinBuffer(toSendBuffer));
var usr = is.readStruct(1,true, TRom.Param);
console.log("TRom.Param.sUserName", usr.sUserName);
console.log("TRom.Param.iId", usr.iId);
第三種場(chǎng)景:對(duì)方服務(wù)要求數(shù)據(jù)流使用Tup協(xié)議悴能,并且已經(jīng)約定好了各個(gè)變量的名字揣钦。我們可以按如下的方法進(jìn)行編碼:
// 客戶端根據(jù)約定的名字,將結(jié)構(gòu)體放入Tup中
var Tars = require("@tars/stream");
var TRom = require("./Protocol.js").TRom;
var usr = new TRom.Param();
usr.sUserName = "KevinTian";
usr.iId = 10000;
var tup_encode = new Tars.Tup();
tup_encode.writeStruct("userInfo", usr);
// 打包并得到發(fā)送的二進(jìn)制數(shù)據(jù)流
var toSendBuffer = tup_encode.encode(true).toNodeBuffer();
客戶端將toSendBuffer發(fā)送給服務(wù)端漠酿,并且服務(wù)端接受完畢之后按如下方法進(jìn)行解碼:
var Tars = require("@tars/stream");
var TRom = require("./Protocol.js").TRom;
var tup_decode = new Tars.Tup();
tup_decode.decode(new Tars.BinBuffer(toSendBuffer));
var usr = tup_decode,readStruct("userInfo", TRom.Param);
console.log("TRom.Param.sUserName", usr.sUserName);
console.log("TRom.Param.iId", usr.iId);
06-復(fù)雜類型-vector(數(shù)組)的使用方法說(shuō)明
由于JavaScript原生的Array不支持tars中的一些特殊化操作冯凹,所以我們對(duì)它進(jìn)行了一次封裝。開(kāi)發(fā)者可以按下述的代碼理解:
[stream].List = function(proto)
{
this.proto = proto;
this.value = new Array();
this.push = function(value) { this.value.push(value) };
}
屬性 | 描述 |
---|---|
value | Js中的Array數(shù)據(jù)類型炒嘲。Tars.List實(shí)際是基于該Array進(jìn)行的上層封裝 |
length | 返回?cái)?shù)組中元素的數(shù)目 |
[stream].List對(duì)象屬性
屬性 | 描述 |
---|---|
value | Js中的Array數(shù)據(jù)類型宇姚。Tars.List實(shí)際是基于該Array進(jìn)行的上層封裝 |
length | 返回?cái)?shù)組中元素的數(shù)目 |
方法 | 描述 |
---|---|
at | 返回?cái)?shù)組中指定位置的元素。 |
push | 向數(shù)組的末尾添加一個(gè)元素夫凸。 |
forEach | 當(dāng)前數(shù)組的遍歷方法浑劳,具體使用方法請(qǐng)參考后面的示例。 |
toObject | 將List實(shí)例轉(zhuǎn)化成基本的數(shù)據(jù)對(duì)象夭拌,具體使用方法請(qǐng)參考后面的實(shí)例魔熏。 |
readFromObject | 將傳入的數(shù)組處理后push到List實(shí)例中衷咽,具體使用方法請(qǐng)參考后面的示例。 |
[stream].List對(duì)象方法
方法 | 描述 |
---|---|
at | 返回?cái)?shù)組中指定位置的元素蒜绽。 |
push | 向數(shù)組的末尾添加一個(gè)元素镶骗。 |
forEach | 當(dāng)前數(shù)組的遍歷方法,具體使用方法請(qǐng)參考后面的示例滓窍。 |
toObject | 將List實(shí)例轉(zhuǎn)化成基本的數(shù)據(jù)對(duì)象卖词,具體使用方法請(qǐng)參考后面的實(shí)例。 |
readFromObject | 將傳入的數(shù)組處理后push到List實(shí)例中吏夯,具體使用方法請(qǐng)參考后面的示例此蜈。 |
proto是Vector的類型原型(類型原型決定了在對(duì)Vector編解碼時(shí)采用的方法,所以聲明Vector的時(shí)候必須傳入正確的類型原型)噪生。
[stream].List的聲明示例
var Tars = require("@tars/stream");
// 例子1: 聲明vector<int32>
var va = new Tars.List(Tars.Int32);
// 例子2: 聲明vector<string>
var vb = new Tars.List(Tars.String);
// 例子2: 聲明vector<map<uint32, string>>
var vc = new Tars.List(Tars.Map(Tars.UInt32, Tars.String));
// 例子1: 聲明vector<struct>裆赵,假設(shè)結(jié)構(gòu)體名稱為T(mén)Rom.Param
var vd = new Tars.Vector(TRom.Param);
[stream].List的操作示例
var Tars = require("@tars/stream");
var ve = new Tars.List(Tars.String);
// 向數(shù)組添加元素
ve.push("TENCENT-MIG");
ve.push("TENCENT-SNG");
ve.push("TENCENT-IEG");
ve.push("TENCENT-TEG");
// 獲取數(shù)組的長(zhǎng)度
console.log("Length:", ve.length);
// 獲取指定位置的元素
console.log("Array[1]:", ve.at(1));
// 遍歷方法1:
ve.forEach(function (value, index, oArray) {
console.log("Array[" + index + "]:", value);
});
// 遍歷方法2:
for (var index = 0, len = ve.length; index < len; index++) {
console.log("Array[" + index + "]:", ve.at(index);
};
// toObject方法和readFromObject方法的詳細(xì)例子可以參照sample/list路徑下的test-list-c3文件
var user1 = new TRom.User_t();
user1.id = 1;
user1.name = 'x1';
user1.score = 1;
var user2 = new TRom.User_t();
user2.id = 2;
user2.name = 'x2';
user2.score = 2;
var user3 = new TRom.User_t();
user3.id = 3;
user3.name = 'x3';
user3.score = 3;
var userList1 = new Tars.List(TRom.User_t);
console.log('user1: ', user1);
console.log('user2: ', user2);
userList1.push(user1);
userList1.push(user2);
// toObject方法
console.log('userList1: ', userList1.toObject());
var userList2 = new Tars.List(TRom.User_t);
// readFromObject方法
userList2.readFromObject([user1, user2, user3]);
console.log('userList2: ', userList2.toObject());
07-復(fù)雜類型-map(字典)的使用方法說(shuō)明
由于JavaScript原生的Object不支持tars中的一些特殊化操作,所以我們對(duì)它進(jìn)行了一次封裝跺嗽。開(kāi)發(fā)者可按下述的代碼理解:
[stream].Map = function(kpoto, vpoto) {
var Map = function() {
this._kproto = kpoto;
this._vproto = vpoto;
this.value = new Object();
this.put = function(key, value) { this.insert(key, value); }
......
}
return new Map();
}
屬性 | 描述 |
---|---|
value | Js中的Object數(shù)據(jù)類型战授。[stream],Map實(shí)際是基于該Object進(jìn)行的上層封裝。 |
[stream].Map對(duì)象屬性
屬性 | 描述 |
---|---|
value | Js中的Object數(shù)據(jù)類型桨嫁。[stream],Map實(shí)際是基于該Object進(jìn)行的上層封裝植兰。 |
方法 | 描述 |
---|---|
insert | 向字典中添加一個(gè)元素 |
set | 同insert |
put | 同insert |
remove | 根據(jù)指定的key,從字典中刪除對(duì)應(yīng)的數(shù)值璃吧。 |
clear | 清空當(dāng)前字典楣导。 |
has | 根據(jù)指定的key,判斷字典中是否包含對(duì)應(yīng)的數(shù)值 |
size | 返回當(dāng)前字典中元素的數(shù)目 |
forEach | 當(dāng)前數(shù)組的遍歷方法畜挨,具體使用方法請(qǐng)參考后面的示例筒繁。 |
toObject | 將Map實(shí)例轉(zhuǎn)化成基本的數(shù)據(jù)對(duì)象,具體方法請(qǐng)參考后面的示例巴元。 |
readFromObject | 將傳入的對(duì)象處理后insert到Map實(shí)例中毡咏,具體使用方法參考后面的示例。 |
[stream].Map方法屬性
方法 | 描述 |
---|---|
insert | 向字典中添加一個(gè)元素 |
set | 同insert |
put | 同insert |
remove | 根據(jù)指定的key逮刨,從字典中刪除對(duì)應(yīng)的數(shù)值呕缭。 |
clear | 清空當(dāng)前字典。 |
has | 根據(jù)指定的key禀忆,判斷字典中是否包含對(duì)應(yīng)的數(shù)值 |
size | 返回當(dāng)前字典中元素的數(shù)目 |
forEach | 當(dāng)前數(shù)組的遍歷方法臊旭,具體使用方法請(qǐng)參考后面的示例。 |
toObject | 將Map實(shí)例轉(zhuǎn)化成基本的數(shù)據(jù)對(duì)象箩退,具體方法請(qǐng)參考后面的示例离熏。 |
readFromObject | 將傳入的對(duì)象處理后insert到Map實(shí)例中,具體使用方法參考后面的示例戴涝。 |
[stream].Map的聲明示例
var Tars = require("@tars/stream");
// 例子1: 聲明map<int32, int32>
var ma = new Tars.Map(Tars.Int32, Tars.Int32);
// 例子2: 聲明map<int32, string>
var mb = new Tars.Map(Tars.Int32, Tars.String);
// 例子3: 聲明map<string, string>
var mc = new Tars.Map(Tars.String, Tars.String);
// 例子4: 聲明map<string, vector<int32>>
var md = new Tars.Map(Tars.String, Tars.List(Tars.Int32));
// 例子5: 聲明map<string, map<int32, vector<string>>>
var me = new Tars.Map(Tars.Int32, Tars.Map(Tars.Int32, Tars.List(Tars.String)));
// 例子6: 聲明map<string, struct>的方法滋戳,假設(shè)結(jié)構(gòu)體名稱為T(mén)Rom.Param
var mf = new Tars.Map(Tars.String, TRom.Param);
[stream].Map的操作示例
var Tars = require("@tars/stream");
var mc = new Tars.Map(Tars.String, Tars.String);
// 向字典中添加元素
mc.insert("KEY-00", "TENCENT-MIG");
mc.insert("KEY-01", "TENCENT-IEG");
mc.insert("KEY-02", "TENCENT-TEG");
mc.insert("KEY-03", "TENCENT-SNG");
// 獲取字典元素大小
console.log("SIZE:", mc.size());
// 判斷字典是否有指定的值
console.log("Has:", mc.has("KEY-04"));
// 字典遍歷
mc.forEach(function(key, value) {
console.log("KEY:", key);
console.log("VALUE:", value);
});
// toObject方法和readFromObject方法的詳細(xì)例子可以參照sample/map路徑下的test-map-c5.js文件
var user1 = new TRom.User_t();
user1.id = 1;
user1.name = 'x1';
user1.score = 1;
var user2 = new TRom.User_t();
user2.id = 2;
user2.name = 'x2';
user2.score = 2;
var user3 = new TRom.User_t();
user3.id = 3;
user3.name = 'x3';
user3.score = 3;
var userMap1 = new Tars.Map(Tars.String, TRom.User_t);
userMap1.insert('user1', user1);
userMap1.insert('user2', user2);
// toObject方法
console.log('userMap1: ', userMap1.toObject());
var userMap2 = new Tars.Map(Tars.String, TRom.User_t);
// readFromObject方法
userMap2.readFromObject({
'user1' : user1,
'user2' : user2,
'user3' : user3
});
console.log('userMap2: ', userMap2.toObject());
支持MultiMap類型
支持MultiMap類型钻蔑,此類型允許以一個(gè)結(jié)構(gòu)體作為Map的key。javascript原生對(duì)象沒(méi)有辦法表示此數(shù)據(jù)類型奸鸯,因此此類型沒(méi)有實(shí)現(xiàn)普通Map支持的toObject和readFromObject方法咪笑。
其操作實(shí)例如下:
// 構(gòu)造Map柯旭
var msg = new Tars.Map(Test.StatMicMsgHead, Test.StatMicMsgBody);
msg.put(StatMicMsgHead1, StatMicMsgBody1);
msg.put(StatMicMsgHead2, StatMicMsgBody2);
// tars編碼
var os = new Tars.OutputStream();
os.writeMap(1, msg);
// tars解碼
var data = os.getBinBuffer().toNodeBuffer();
var is = new Tars.InputStream(new Tars.BinBuffer(data));
var ta = is.readMap(1, true, Tars.Map(Test.StatMicMsgHead, Test.StatMicMsgBody));
// 遍歷Map結(jié)果集
ta.forEach(function (key, value) {
console.log("KEY:", key.masterName, "VALUE.totalRspTime", value.totalRspTime);
});
// 根據(jù)值去獲取
var tb = ta.get(StatMicMsgHead2);
if (tb == undefined) {
console.log("not found by name: StatMicMsgHead2");
} else {
console.log(tb.totalRspTime);
}
08-復(fù)雜類型-二進(jìn)制Buffer的使用方法說(shuō)明
在瀏覽器中我們可以使用DataView和ArrayBuffer來(lái)存儲(chǔ)和操作二進(jìn)制數(shù)據(jù)。NodeJS為了提升性能娄涩,自身提供了一個(gè)Buffer類窗怒。為了方便Tars編解碼,我們隊(duì)Buffer類進(jìn)行了一層封裝蓄拣。開(kāi)發(fā)者可以按下述的代碼來(lái)
理解扰肌。
[stream].BinBuffer = function (buffer) {
this._buffer = (buffer != undefined && buffer instanceof Buffer) ? buffer : null;
this._length = (buffer != undefined && buffer instanceof Buffer) ? buffer,length : 0;
this._capacity = this._length;
this._position = 0;
}
屬性 | 描述 |
---|---|
length | 獲取該二進(jìn)制Buffer的數(shù)據(jù)長(zhǎng)度 |
capacity | 獲取該二進(jìn)制Buffer在不重復(fù)分配內(nèi)存的情況下毕匀,可容納數(shù)據(jù)的最大長(zhǎng)度 |
position | 獲取或者設(shè)置當(dāng)前二進(jìn)制Buffer的訪問(wèn)指針 |
[stream].BinBuffer對(duì)象屬性
屬性 | 描述 |
---|---|
length | 獲取該二進(jìn)制Buffer的數(shù)據(jù)長(zhǎng)度 |
capacity | 獲取該二進(jìn)制Buffer在不重復(fù)分配內(nèi)存的情況下洁墙,可容納數(shù)據(jù)的最大長(zhǎng)度 |
position | 獲取或者設(shè)置當(dāng)前二進(jìn)制Buffer的訪問(wèn)指針 |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
srcBuffer | NodeJS.Buffer | $1600 |
offset | Unit32 | 表示拷貝srcBuffer的起始位置 |
byteLength | Unit32 | 表示從offset開(kāi)始剿配,從srcBuffer中拷貝的數(shù)據(jù)量 |
length和capacity的區(qū)別:
加入我們向BinBuffer中寫(xiě)入一個(gè)int32類型的數(shù)據(jù)。寫(xiě)成功之后咽斧,length和capacity的區(qū)別:由于BinBuffer類在第一次分配時(shí)使用默認(rèn)的512長(zhǎng)度來(lái)申請(qǐng)內(nèi)存堪置,此時(shí)capacity的值為512。length表示當(dāng)前Buffer中存在真實(shí)數(shù)據(jù)的大小张惹,此時(shí)length的值為4
[stream].BinBuffer方法屬性
toNodeBuffer
函數(shù)定義:[stream].BinBuffer.toNodeBuffer()
函數(shù)作用:返回當(dāng)前二進(jìn)制Buffer的數(shù)據(jù)舀锨,該值為深拷貝的類型NodeJS.Buffer的數(shù)據(jù)
輸入?yún)?shù):無(wú)
返回?cái)?shù)據(jù):NodeJS.Buffer類型
print
函數(shù)定義:[stream].BinBuffer.print()
函數(shù)作用:以每行16個(gè)字節(jié),并16進(jìn)制的方式打印當(dāng)前的Buffer
writeNodeBuffer
函數(shù)定義:[stream],BinBuffer.writeNodeBuffer(srcBuffer, offset, byteLength)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入NodeJS.Buffer類數(shù)據(jù)
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
srcBuffer | NodeJS.Buffer | $1600 |
offset | Unit32 | 表示拷貝srcBuffer的起始位置 |
byteLength | Unit32 | 表示從offset開(kāi)始宛逗,從srcBuffer中拷貝的數(shù)據(jù)量 |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
value | [stream].BinBuffer | 表示二進(jìn)制Buffer |
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + byteLength
[2]當(dāng)前BinBuffer的position = position(原Buffer的位置指針) + byteLength
writeBinBuffer
函數(shù)定義:[stream].BinBuffer.writeBinBuffer(value)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入[stream].BinBuffer類數(shù)據(jù)
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
value | [stream].BinBuffer | 表示二進(jìn)制Buffer |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
value | Int8 | 8位的整型數(shù)據(jù) |
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + value.length
[2]當(dāng)前BinBuffer的position = position(原Buffer的位置指針) + value.length
writeInt8
函數(shù)定義:[stream],BinBuffer.writeInt8(value)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入Int8類數(shù)據(jù)
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
value | Int8 | 8位的整型數(shù)據(jù) |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
value | Int16 | 16位的整型數(shù)據(jù) |
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + 1
[2]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 1
writeInt16
函數(shù)定義:[stream],BinBuffer.writeInt16(value)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入Int16類數(shù)據(jù)
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
value | Int16 | 16位的整型數(shù)據(jù) |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
value | Int32 | 32位的整型數(shù)據(jù) |
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + 2
[2]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 2
[3]數(shù)據(jù)存儲(chǔ)采用網(wǎng)絡(luò)字節(jié)序
writeInt32
函數(shù)定義:[stream],BinBuffer.writeInt32(value)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入Int32類數(shù)據(jù)
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
value | Int32 | 32位的整型數(shù)據(jù) |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
value | Int64 | 64位的整型數(shù)據(jù) |
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + 4
[2]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 4
[3]數(shù)據(jù)存儲(chǔ)采用網(wǎng)絡(luò)字節(jié)序
writeInt64
函數(shù)定義:[stream],BinBuffer.writeInt64(value)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入Int64類數(shù)據(jù)
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
value | Int64 | 64位的整型數(shù)據(jù) |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
value | UInt8 | 8位的整型數(shù)據(jù) |
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + 8
[2]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 8
[3]數(shù)據(jù)存儲(chǔ)采用網(wǎng)絡(luò)字節(jié)序
writeUInt8
函數(shù)定義:[stream].BinBuffer.writeUInt8(value)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入U(xiǎn)Int8類數(shù)據(jù)
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
value | UInt8 | 8位的整型數(shù)據(jù) |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)雁竞,取值范圍[0, 255] |
value | UInt16(Number) | 表示該變量的值,取值范圍[0, 65535] |
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + 1
[2]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 1
writeUInt16
函數(shù)定義:[stream].OutputStream.writeUInt16(tag, value)
函數(shù)作用:向數(shù)據(jù)流寫(xiě)入一個(gè)UInt16類型的變量
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)拧额,取值范圍[0, 255] |
value | UInt16(Number) | 表示該變量的值,取值范圍[0, 65535] |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
value | UInt32 | 32位的整型數(shù)據(jù) |
返回?cái)?shù)據(jù):void
writeUInt32
函數(shù)定義:[stream].BinBuffer.writeUInt32(value)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入一個(gè)UInt32類型的變量
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
value | UInt32 | 32位的整型數(shù)據(jù) |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
value | Float | 32位的單精度浮點(diǎn)數(shù) |
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + 4
[2]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 4
[3]數(shù)據(jù)存儲(chǔ)采用網(wǎng)絡(luò)字節(jié)序
writeFloat
函數(shù)定義:[stream].BinBuffer.writeFloat(value)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入Float(32位彪腔,單精度浮點(diǎn)數(shù))類數(shù)據(jù)
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
value | Float | 32位的單精度浮點(diǎn)數(shù) |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
value | Double | 64位的雙精度浮點(diǎn)數(shù) |
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + 4
[2]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 4
[3]數(shù)據(jù)存儲(chǔ)采用網(wǎng)絡(luò)字節(jié)序
writeDouble
函數(shù)定義:[stream].BinBuffer.writeDouble( value)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入Double(64位侥锦,雙精度浮點(diǎn)數(shù))類數(shù)據(jù)
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
value | Double | 64位的雙精度浮點(diǎn)數(shù) |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
value | String | UTF8編碼的字符串 |
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + 8
[2]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 8
[3]數(shù)據(jù)存儲(chǔ)采用網(wǎng)絡(luò)字節(jié)序
writeString
函數(shù)定義:[stream].BinBuffer.writeString(value)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入String(UTF8編碼)類數(shù)據(jù)
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
value | String | UTF8編碼的字符串 |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
byteLength | UInt32 | 字符串的字節(jié)長(zhǎng)度 |
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + 字符串的字節(jié)長(zhǎng)度
[2]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 字符串的字節(jié)長(zhǎng)度
readInt8
函數(shù)定義:[stream].BinBuffer.readInt8()
函數(shù)作用:從二進(jìn)制Buffer中,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)Int8類型的變量
輸入?yún)?shù):無(wú)
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 1
readInt16
函數(shù)定義:[stream].BinBuffer.readInt16()
函數(shù)作用:從二進(jìn)制Buffer中德挣,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)Int16類型的變量
輸入?yún)?shù):無(wú)
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 2
readInt32
函數(shù)定義:[stream].BinBuffer.readInt32()
函數(shù)作用:從二進(jìn)制Buffer中恭垦,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)Int32類型的變量
輸入?yún)?shù):無(wú)
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 4
readInt64
函數(shù)定義:[stream].BinBuffer.readInt64()
函數(shù)作用:從二進(jìn)制Buffer中,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)Int64類型的變量
輸入?yún)?shù):無(wú)
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 8
readUInt8
函數(shù)定義:[stream].BinBuffer.readUInt8()
函數(shù)作用:從二進(jìn)制Buffer中格嗅,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)readUInt8類型的變量
輸入?yún)?shù):無(wú)
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 1
readUInt16
函數(shù)定義:[stream].BinBuffer.readUInt16()
函數(shù)作用:從二進(jìn)制Buffer中番挺,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)readUInt16類型的變量
輸入?yún)?shù):無(wú)
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 2
readUInt32
函數(shù)定義:[stream].BinBuffer.readUInt32()
函數(shù)作用:從二進(jìn)制Buffer中,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)readUInt32類型的變量
輸入?yún)?shù):無(wú)
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 4
readFloat
函數(shù)定義:[stream].BinBuffer.readFloat()
函數(shù)作用:從二進(jìn)制Buffer中屯掖,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)Float(32位的單精度浮點(diǎn)數(shù))類型的變量
輸入?yún)?shù):無(wú)
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 4
readDouble
函數(shù)定義:[stream].BinBuffer.readDouble()
函數(shù)作用:從二進(jìn)制Buffer中玄柏,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)Double(64位的雙精度浮點(diǎn)數(shù))類型的變量
輸入?yún)?shù):無(wú)
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 8
readString
函數(shù)定義:[stream].BinBuffer.readString(byteLength)
函數(shù)作用:從二進(jìn)制Buffer中,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)String(UTF8編碼)類型的變量
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
byteLength | UInt32 | 字符串的字節(jié)長(zhǎng)度 |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
byteLength | UInt32 | 二進(jìn)制Buffer的字節(jié)長(zhǎng)度 |
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 字符串的字節(jié)長(zhǎng)度
[2]后臺(tái)對(duì)字符串的編碼需要使用UTF8字符集
readBinBuffer
函數(shù)定義:[stream].BinBuffer.readBinBuffer(byteLength)
函數(shù)作用:從二進(jìn)制Buffer中贴铜,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)[stream].BinBuffer類型的變量
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
byteLength | UInt32 | 二進(jìn)制Buffer的字節(jié)長(zhǎng)度 |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)粪摘,取值范圍[0, 255] |
value | Boolean | 表示該變量的值瀑晒,取值范圍[false, true] |
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 二進(jìn)制Buffer的字節(jié)長(zhǎng)度
09 - 編碼工具 - OutputStream的使用方法說(shuō)明
構(gòu)造函數(shù)
函數(shù)定義:[stream].OutputStream()
函數(shù)作用:聲明一個(gè)輸出流對(duì)象
輸入?yún)?shù):無(wú)
使用示例:var os = new [stream].OutputStream()
getBinBuffer
函數(shù)定義:var buffer = [stream].OutputStream.getBinBuffer()
函數(shù)作用:調(diào)用該函數(shù)獲得打包后的二進(jìn)制數(shù)據(jù)
輸入?yún)?shù):無(wú)
返回?cái)?shù)據(jù):返回打包后的二進(jìn)制數(shù)據(jù)流,該返回值類型為[stream].BinBuffer
writeBoolean
函數(shù)定義:[stream].OutputStream.writeBoolean(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)一個(gè)Boolean類型的變量
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)徘意,取值范圍[0, 255] |
value | Boolean | 表示該變量的值苔悦,取值范圍[false, true] |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255] |
value | Int8(Number) | 表示該變量的值椎咧,取值范圍[-128, 127] |
返回?cái)?shù)據(jù):void
writeInt8
函數(shù)定義:[stream].OutputStream.writeInt8(value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)入Int8類型的數(shù)據(jù)
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)玖详,取值范圍[0, 255] |
value | Int8(Number) | 表示該變量的值,取值范圍[-128, 127] |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)勤讽,取值范圍[0, 255] |
value | Int16(Number) | 表示該變量的值蟋座,取值范圍[-32768, 32767] |
返回?cái)?shù)據(jù):void
writeInt16
函數(shù)定義:[stream].OutputStream.writeInt16(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)入Int16類型的變量
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255] |
value | Int16(Number) | 表示該變量的值地技,取值范圍[-32768, 32767] |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)蜈七,取值范圍[0, 255] |
value | Int32(Number) | 表示該變量的值,取值范圍[-2147483648, 2147483647] |
返回?cái)?shù)據(jù):void
writeInt32
函數(shù)定義:[stream].OutputStream.writeInt32(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)一個(gè)Int32類型的變量
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)莫矗,取值范圍[0, 255] |
value | Int32(Number) | 表示該變量的值飒硅,取值范圍[-2147483648, 2147483647] |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255] |
value | int64(Number) | 表示該變量的值作谚,取值范圍[-9223372036854775808, 9223372036854775807] |
writeInt64
函數(shù)定義:[stream].OutputStream.writeInt64(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)一個(gè)Int64類型的變量
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)三娩,取值范圍[0, 255] |
value | int64(Number) | 表示該變量的值,取值范圍[-9223372036854775808, 9223372036854775807] |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)妹懒,取值范圍[0, 255] |
value | UInt8(Number) | 表示該變量的值雀监,取值范圍[0, 255] |
返回?cái)?shù)據(jù):void
writeUInt8
函數(shù)定義:[stream].OutputStream.writeUInt8(tag, value)
函數(shù)作用:向數(shù)據(jù)流寫(xiě)入一個(gè)UInt8類型的變量
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255] |
value | UInt8(Number) | 表示該變量的值眨唬,取值范圍[0, 255] |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)会前,取值范圍[0, 255] |
value | UInt16(Number) | 表示該變量的值,取值范圍[0, 65535] |
返回?cái)?shù)據(jù):void
writeUInt16
函數(shù)定義:[stream].OutputStream.writeUInt16(tag, value)
函數(shù)作用:向數(shù)據(jù)流寫(xiě)入一個(gè)UInt16類型的變量
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)匾竿,取值范圍[0, 255] |
value | UInt16(Number) | 表示該變量的值瓦宜,取值范圍[0, 65535] |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255] |
value | UInt32(Number) | 表示該變量的值岭妖,取值范圍[0, 4294967295] |
返回?cái)?shù)據(jù):void
writeUInt32
函數(shù)定義:[stream].OutputStream.writeUInt32(tag, value)
函數(shù)作用:向數(shù)據(jù)流寫(xiě)入一個(gè)UInt32類型的變量
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)临庇,取值范圍[0, 255] |
value | UInt32(Number) | 表示該變量的值,取值范圍[0, 4294967295] |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)昵慌,取值范圍[0, 255] |
value | Float(Number) | 單精度浮點(diǎn)數(shù)假夺,因?yàn)榫热笔?wèn)題,不推薦使用該類型 |
返回?cái)?shù)據(jù):void
writeFloat
函數(shù)定義:[stream].OutputStream.writeFloat(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)入一個(gè)float(32位)類型的變量
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)斋攀,取值范圍[0, 255] |
value | Float(Number) | 單精度浮點(diǎn)數(shù)已卷,因?yàn)榫热笔?wèn)題,不推薦使用該類型 |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)蜻韭,取值范圍[0, 255] |
value | Double(Number) | 雙精度浮點(diǎn)數(shù)悼尾,因?yàn)榫葥p失問(wèn)題柿扣,不推薦使用該類型 |
返回?cái)?shù)據(jù):void
writeDouble
函數(shù)定義:[stream].OutputStream.writeDouble(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)一個(gè)double(64位)類型的變量
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255] |
value | Double(Number) | 雙精度浮點(diǎn)數(shù)闺魏,因?yàn)榫葥p失問(wèn)題未状,不推薦使用該類型 |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255] |
value | String | 表示該變量的值析桥,字符串編碼字符集為UTF8 |
返回?cái)?shù)據(jù):void
writeString
函數(shù)定義:[stream].OutputStream.writeString(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)入一個(gè)String類型的變量
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)司草,取值范圍[0, 255] |
value | String | 表示該變量的值,字符串編碼字符集為UTF8 |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)泡仗,取值范圍[0, 255] |
value | 自定義結(jié)構(gòu)體 | 結(jié)構(gòu)體必須是使用tars2node轉(zhuǎn)換而成的埋虹,否則可能會(huì)因缺少輔助函數(shù)而導(dǎo)致編解碼失敗 |
返回?cái)?shù)據(jù):void
writeStruct
函數(shù)定義:writeStruct(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)一個(gè)自定義結(jié)構(gòu)體的變量
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255] |
value | 自定義結(jié)構(gòu)體 | 結(jié)構(gòu)體必須是使用tars2node轉(zhuǎn)換而成的娩怎,否則可能會(huì)因缺少輔助函數(shù)而導(dǎo)致編解碼失敗 |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)搔课,取值范圍[0, 255] |
value | [stream]. BinBuffer | BinBuffer是對(duì)NodeJs中的Buffer類的封裝,同時(shí)集成了編碼解碼需要用到的輔助函數(shù) |
返回?cái)?shù)據(jù):void
writeBytes
函數(shù)定義:[stream].OutputStream.writeBytes(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)入一個(gè)char*或者vector<char>的變量
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)截亦,取值范圍[0, 255] |
value | [stream]. BinBuffer | BinBuffer是對(duì)NodeJs中的Buffer類的封裝爬泥,同時(shí)集成了編碼解碼需要用到的輔助函數(shù) |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255] |
value | [stream].List(T) | 該變量的類型原型 |
返回?cái)?shù)據(jù):void
writeList
函數(shù)定義:[stream].OutputStream.writeList(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)一個(gè)類型為vector<T>(T不可為byte)的變量
函數(shù)參數(shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)崩瓤,取值范圍[0, 255] |
value | [stream].List(T) | 該變量的類型原型 |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)袍啡,取值范圍[0, 255] |
value | [stream].Map(T, V) | 該變量的類型原型 |
返回?cái)?shù)據(jù):void
writeMap
函數(shù)定義:[stream].OutputStream.writeMap(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)一個(gè)類型為map<T, V>類型的字段。
函數(shù)參數(shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示該變量的數(shù)字標(biāo)識(shí)却桶,取值范圍[0, 255] |
value | [stream].Map(T, V) | 該變量的類型原型 |
返回?cái)?shù)據(jù):void
10-解碼工具-InputStream的使用方法說(shuō)明
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí)境输,取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值,取值范圍{false, true} |
default | Boolean | 表示讀取變量不成功時(shí)的返回值颖系,取值范圍{false, true} |
構(gòu)造函數(shù)
函數(shù)定義:[stream].InputStream(binBuffer)
函數(shù)作用:聲明一個(gè)輸入流對(duì)象
輸入?yún)?shù):binBuffer欲解碼的二進(jìn)制數(shù)據(jù)流嗅剖,該值類型必須為[stream].BinBuffer,而不能是NodeJs中實(shí)現(xiàn)的Buffer類嘁扼。
使用示例: var is = new [stream].InputStream(new [stream].BinBuffer(Node.Buffer))
readBoolean
函數(shù)定義:var value = [stream].InputStream.readBoolean(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)Boolean類型的數(shù)值
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí)窗悯,取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值,取值范圍{false, true} |
default | Boolean | 表示讀取變量不成功時(shí)的返回值偷拔,取值范圍{false, true} |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值亏钩,取值范圍{false, true} |
default | Int8 | 表示讀取變量不成功時(shí)的返回值莲绰,取值范圍[-128, 127] |
對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中姑丑,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常蛤签;
當(dāng) require === false 時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中栅哀,系統(tǒng)將返回變量的默認(rèn)值default震肮;
返回?cái)?shù)據(jù):Boolean称龙,取值范圍{false, true}
readInt8
函數(shù)定義:[stream].InputStream.readInt8(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)Int8類型的數(shù)值
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值戳晌,取值范圍{false, true} |
default | Int8 | 表示讀取變量不成功時(shí)的返回值鲫尊,取值范圍[-128, 127] |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值沦偎,取值范圍{false, true} |
default | Int16 | 表示讀取變量不成功時(shí)的返回值疫向,取值范圍[-32768, 32767] |
對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中豪嚎,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常搔驼;
當(dāng) require === false 時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中侈询,系統(tǒng)將返回變量的默認(rèn)值default舌涨;
返回?cái)?shù)據(jù):Int8,取值范圍[-128, 127]
readInt16
函數(shù)定義:[stream].InputStream.readInt16(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)Int16類型的數(shù)值
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí)扔字,取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值囊嘉,取值范圍{false, true} |
default | Int16 | 表示讀取變量不成功時(shí)的返回值,取值范圍[-32768, 32767] |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí)啦租,取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值哗伯,取值范圍{false, true} |
default | Int32 | 表示讀取變量不成功時(shí)的返回值,取值范圍[-2147483648, 2147483647] |
對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí)篷角,如果當(dāng)前變量不在數(shù)據(jù)流中焊刹,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常;
當(dāng) require === false 時(shí)恳蹲,如果當(dāng)前變量不在數(shù)據(jù)流中虐块,系統(tǒng)將返回變量的默認(rèn)值default;
返回?cái)?shù)據(jù):Int16嘉蕾,取值范圍[-32768, 32767]
readInt32
函數(shù)定義:[stream].InputStream.readInt32(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)Int32類型的數(shù)值
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí)贺奠,取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值,取值范圍{false, true} |
default | Int32 | 表示讀取變量不成功時(shí)的返回值错忱,取值范圍[-2147483648, 2147483647] |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí)儡率,取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值,取值范圍{false, true} |
default | Int64 | 表示讀取變量不成功時(shí)的返回值以清,取值范圍[-9223372036854775808, 9223372036854775807] |
對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí)儿普,如果當(dāng)前變量不在數(shù)據(jù)流中,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常掷倔;
當(dāng) require === false 時(shí)眉孩,如果當(dāng)前變量不在數(shù)據(jù)流中,系統(tǒng)將返回變量的默認(rèn)值default;
返回?cái)?shù)據(jù):Int32浪汪,取值范圍[-2147483648, 2147483647]
readInt64
函數(shù)定義:[stream].InputStream.readInt64(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)Int64類型的數(shù)值
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí)巴柿,取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值,取值范圍{false, true} |
default | Int64 | 表示讀取變量不成功時(shí)的返回值死遭,取值范圍[-9223372036854775808, 9223372036854775807] |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí)广恢,取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值,取值范圍{false, true} |
default | UInt8 | 表示讀取變量不成功時(shí)的返回值殃姓,取值范圍[0, 255] |
對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí)袁波,如果當(dāng)前變量不在數(shù)據(jù)流中,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常蜗侈;
當(dāng) require === false 時(shí)篷牌,如果當(dāng)前變量不在數(shù)據(jù)流中,系統(tǒng)將返回變量的默認(rèn)值default踏幻;
返回?cái)?shù)據(jù):Int64(Number)枷颊,取值范圍[-9223372036854775808, 9223372036854775807]
readUInt8
函數(shù)定義:[stream].InputStream.readUInt8(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)UInt8類型的數(shù)值
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值该面,取值范圍{false, true} |
default | UInt8 | 表示讀取變量不成功時(shí)的返回值夭苗,取值范圍[0, 255] |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值隔缀,取值范圍{false, true} |
default | UInt16 | 表示讀取變量不成功時(shí)的返回值题造,取值范圍[0, 65535] |
對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中猾瘸,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常界赔;
當(dāng) require === false 時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中牵触,系統(tǒng)將返回變量的默認(rèn)值default淮悼;
返回?cái)?shù)據(jù):UInt8(Number),取值范圍[0, 255]
readUInt16
函數(shù)定義:[stream].InputStream.readUInt16(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)UInt16類型的數(shù)值
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí)揽思,取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值袜腥,取值范圍{false, true} |
default | UInt16 | 表示讀取變量不成功時(shí)的返回值,取值范圍[0, 65535] |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí)钉汗,取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值羹令,取值范圍{false, true} |
default | UInt16 | 表示讀取變量不成功時(shí)的返回值,取值范圍[0, 4294967295] |
對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí)损痰,如果當(dāng)前變量不在數(shù)據(jù)流中特恬,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常;
當(dāng) require === false 時(shí)徐钠,如果當(dāng)前變量不在數(shù)據(jù)流中,系統(tǒng)將返回變量的默認(rèn)值default役首;
返回?cái)?shù)據(jù):UInt16(Number)尝丐,取值范圍[0, 65535]
readUInt32
函數(shù)定義:[stream].InputStream.readUInt32(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)UInt32類型的數(shù)值
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí)显拜,取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值,取值范圍{false, true} |
default | UInt16 | 表示讀取變量不成功時(shí)的返回值爹袁,取值范圍[0, 4294967295] |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí)远荠,取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值,取值范圍{false, true} |
default | Float | 表示讀取變量不成功時(shí)的返回值 |
對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí)失息,如果當(dāng)前變量不在數(shù)據(jù)流中譬淳,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常;
當(dāng) require === false 時(shí)盹兢,如果當(dāng)前變量不在數(shù)據(jù)流中邻梆,系統(tǒng)將返回變量的默認(rèn)值default;
返回?cái)?shù)據(jù):UInt32(Number)绎秒,取值范圍[0, 4294967295]
readFloat
函數(shù)定義:[stream].InputStream.readFloat(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)Float(32位浦妄,單精度浮點(diǎn)數(shù))類型的數(shù)值
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值见芹,取值范圍{false, true} |
default | Float | 表示讀取變量不成功時(shí)的返回值 |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí)剂娄,取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值,取值范圍{false, true} |
default | Double | 表示讀取變量不成功時(shí)的返回值 |
對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí)玄呛,如果當(dāng)前變量不在數(shù)據(jù)流中阅懦,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常;
當(dāng) require === false 時(shí)徘铝,如果當(dāng)前變量不在數(shù)據(jù)流中耳胎,系統(tǒng)將返回變量的默認(rèn)值default;
返回?cái)?shù)據(jù):Float(Number)
readDouble
函數(shù)定義:[stream].InputStream.readDouble(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)Double(64位庭砍,雙精度浮點(diǎn)數(shù))類型的數(shù)值
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí)场晶,取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值巾陕,取值范圍{false, true} |
default | Double | 表示讀取變量不成功時(shí)的返回值 |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí)怕敬,取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值,取值范圍{false, true} |
default | String | 表示讀取變量不成功時(shí)的返回值 |
對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí)屏歹,如果當(dāng)前變量不在數(shù)據(jù)流中揭北,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常扳炬;
當(dāng) require === false 時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中搔体,系統(tǒng)將返回變量的默認(rèn)值default恨樟;
返回?cái)?shù)據(jù):Double(Number)
readString
函數(shù)定義:[stream].InputStream.readString(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)String(UTF8編碼)類型的數(shù)值
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值疚俱,取值范圍{false, true} |
default | String | 表示讀取變量不成功時(shí)的返回值 |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲讀取變量的數(shù)字標(biāo)識(shí)劝术,取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值,取值范圍{false, true} |
TYPE_T | 自定義結(jié)構(gòu)體的類型原型 | 表示該變量的類型原型 |
對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中养晋,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常衬吆;
當(dāng) require === false 時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中绳泉,系統(tǒng)將返回變量的默認(rèn)值default逊抡;
返回?cái)?shù)據(jù):String (UTF8編碼)
readStruct
函數(shù)定義:[stream].InputStream.readStruct(tag, require, TYPE_T)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)自定義結(jié)構(gòu)體類型的數(shù)值
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲讀取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值零酪,取值范圍{false, true} |
TYPE_T | 自定義結(jié)構(gòu)體的類型原型 | 表示該變量的類型原型 |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲讀取變量的數(shù)字標(biāo)識(shí)冒嫡,取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值,取值范圍{false, true} |
TYPE_T | [stream].BinBuffer | 表示該變量的類型原型 |
當(dāng) require === true 時(shí)四苇,如果當(dāng)前變量不在數(shù)據(jù)流中孝凌,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常;
當(dāng) require === false 時(shí)蛔琅,如果當(dāng)前變量不在數(shù)據(jù)流中胎许,系統(tǒng)將返回空的結(jié)構(gòu)體實(shí)例;
返回?cái)?shù)據(jù):自定義結(jié)構(gòu)體的實(shí)例
readBytes
函數(shù)定義:[stream].InputStream.readBytes(tag, require, TYPE_T)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)[stream].BinBuffer類型的數(shù)值
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲讀取變量的數(shù)字標(biāo)識(shí)罗售,取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值辜窑,取值范圍{false, true} |
TYPE_T | [stream].BinBuffer | 表示該變量的類型原型 |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲讀取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值寨躁,取值范圍{false, true} |
TYPE_T | [stream].List | 表示該變量的類型原型 |
返回?cái)?shù)據(jù):[stream].BinBuffer
readList
函數(shù)定義:[stream].InputStream.readList(tag, require, TYPE_T)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)[stream],List<T>類型的數(shù)值
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲讀取變量的數(shù)字標(biāo)識(shí)穆碎,取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值,取值范圍{false, true} |
TYPE_T | [stream].List | 表示該變量的類型原型 |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲讀取變量的數(shù)字標(biāo)識(shí)职恳,取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值所禀,取值范圍{false, true} |
TYPE_T | [stream].List | 表示該變量的類型原型 |
對(duì)require的說(shuō)明:
當(dāng) require === true時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中放钦,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常色徘;
當(dāng) require === false時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中操禀,系統(tǒng)將返回一個(gè)空的[stream].List(T)的實(shí)例褂策;
返回?cái)?shù)據(jù):[stream].List(T)
readList
函數(shù)定義:[stream].InputStream.readList(tag, require, TYPE_T)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)[stream],List<T>類型的數(shù)值
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲讀取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值颓屑,取值范圍{false, true} |
TYPE_T | [stream].List | 表示該變量的類型原型 |
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲讀取變量的數(shù)字標(biāo)識(shí)斤寂,取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值,取值范圍{false, true} |
TYPE_T | [stream].Map(T, V) | 表示該變量的類型原型 |
對(duì)require的說(shuō)明:
當(dāng) require === true時(shí)揪惦,如果當(dāng)前變量不在數(shù)據(jù)流中遍搞,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常;
當(dāng) require === false時(shí)器腋,如果當(dāng)前變量不在數(shù)據(jù)流中溪猿,系統(tǒng)將返回一個(gè)空的[stream].List(T)的實(shí)例钩杰;
返回?cái)?shù)據(jù):[stream].List(T)
readMap
函數(shù)定義:[stream].InputStream.readMap(tag, require, TYPE_T)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)[stream],Map<T, V>類型的數(shù)值
輸入?yún)?shù):
參數(shù) | 數(shù)據(jù)類型 | 描述 |
---|---|---|
tag | UInt8 | 表示欲讀取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255] |
require | Boolean | 表示當(dāng)前變量是否為必須值诊县,取值范圍{false, true} |
TYPE_T | [stream].Map(T, V) | 表示該變量的類型原型 |
對(duì)require的說(shuō)明:
當(dāng) require === true時(shí)榜苫,如果當(dāng)前變量不在數(shù)據(jù)流中,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常翎冲;
當(dāng) require === false時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中媳荒,系統(tǒng)將返回一個(gè)空的[stream].Map(T, V)的實(shí)例抗悍;
返回?cái)?shù)據(jù):[stream].Map(T, V)
registry
TARS 框架中的主控請(qǐng)求模塊
包括:
EndpointF.tars
EndpointFTars.js
QueryF.tars
QueryFProxy.js
index.js
package.json
utils
TARS框架輔助工具集合
@tars/utils
TARS框架輔助工具集合
Installation
$ npm install @tars/utils
01.配置文件解析器
var Config = require('@tars/utils').Config;
API
parseFile(sFilePath, [encoding, callback])
解析指定文件
- sFilePath:文件名
- encoding:文件編碼類型。(默認(rèn)值: utf8)
- callback:回調(diào)函數(shù)钳枕,回調(diào)函數(shù)的格式為function callback(ret, config){}缴渊,其中ret為對(duì)象{code:返回碼,成功為0鱼炒,失敗為-1衔沼,message:描述,exception:如果成功為undefined昔瞧,如果失敗為事件對(duì)象}指蚁,config為解析器本身
parseText(sText)
解析字符串,并將解析的結(jié)果存于內(nèi)部_data屬性中自晰,可以通過(guò)get方法獲取相應(yīng)的值凝化。
- sText:字符串
- return:true:解析成功,false:解析失敗
get(key, defaultValue)
文件被解析之后酬荞,會(huì)將結(jié)果存儲(chǔ)在一個(gè)對(duì)象中搓劫,通過(guò)get方法可以獲取指定的值。注:如果配置文件/字符串中有相同的key混巧,則get獲取key對(duì)應(yīng)的值時(shí)枪向,不會(huì)獲取所有的值,而是獲取該key最后對(duì)應(yīng)的那個(gè)值咧党,可以理解為對(duì)應(yīng)相同的key后面的值覆蓋前面的值秘蛔。
- key: 需要取值的key值,格式為x1.x2.x3凿傅,其中x1缠犀、x2、x3依次為深層次的key聪舒,注:如果key值本身為x1.x2格式辨液,取該key對(duì)應(yīng)的值時(shí)需要寫(xiě)成<x1.x2>,具體使用參見(jiàn)例子箱残。
- defaultValue: 取不到結(jié)果的默認(rèn)值
getDomain(key, defaultValue)
獲取key對(duì)應(yīng)的值中類型為Object的屬性數(shù)組 - key: key值
- defaultValue: 取不到結(jié)果的默認(rèn)值
**getDomainValue(key, defaultValue)
獲取key對(duì)應(yīng)的值中類型為Object的屬性值數(shù)組 - key: key值滔迈。
- defaultValue: 取不到結(jié)果的默認(rèn)值
**getDomainLine(key, defaultValue)
獲取key對(duì)于路徑下的所有非空行 - key: key值
- defaultValue: 取不到結(jié)果的默認(rèn)值
- return: 數(shù)組
data
通過(guò)該屬性止吁,可以獲取文件解析的結(jié)果
example
var Config = require('@tars/utils').Config;
var config = new Config();
config.parseFile('./config.conf', 'utf8');
var data = config.data;
console.log('data: ', data);
console.log('get: tars.application.server.local: ', config.get('tars.application.server.local'));
console.log('getDomain: tars.application.server: ', config.getDomain('tars.application.server'));
console.log('getDomainValue: tars.application.server: ', config.getDomainValue('tars.application.server'));
具體例子參加examples目錄下的test-config.js文件
02.Endpoint工具
var Endpoint = require('@tars/utils').Endpoint;
API
Class方法:parse(desc)
從字符串中解析出Endpoint信息
- desc:字符串,例如:'tcp -h 127.0.0.1 -p 10000 -t 60000'
- return:返回Endpoint實(shí)例燎悍。
toString()
Endpoint信息轉(zhuǎn)化成字符串
copy()
拷貝Endpoint實(shí)例
example
var Endpoint = require('@tars.utils').Endpoint;
var endpoint = Endpoint.parse('tcp -h 127.0.0.1 -p 10000 -t 60000');
console.log('endpoint: ' + endpoint.toString());
console.log('endpoint.copy: ' + endpoint.copy().toString());
具體例子參見(jiàn)examples目錄下的test-endpoint.js文件
03.timeProvider工具
var timeProvider = require('@tars/utils').timeProvider;
API
nowTimestamp()
采用Date.now()的方式獲取時(shí)間敬惦,此種方式效率最高,Date.now()方式的效率大概是new Date.getTime()的2倍谈山,是process.hrtime()方式的4倍俄删。
- return:返回對(duì)象
{
hrtime: // 數(shù)據(jù)類型。[秒奏路,納秒]畴椰,
timestamp: // 單位ms
}
diff(oTime)
當(dāng)前時(shí)間相對(duì)于oTime的時(shí)間間隔
- oTime:相對(duì)時(shí)間,nowTimestamp函數(shù)返回的對(duì)象類型
- return:浮點(diǎn)類型鸽粉,時(shí)間間隔斜脂,單位毫秒
- 注:nowTimestamp和diff配對(duì)使用
dateTimestamp()
獲取當(dāng)前的時(shí)間戳,即機(jī)器從啟動(dòng)到當(dāng)前的時(shí)間(process.hrtime) - return:返回對(duì)象
{
hrtime: // 數(shù)組類型触机,[秒, 納秒],
timestamp: // 單位ms
}
dateTimestampDiff(oTime)
當(dāng)前時(shí)間相對(duì)于oTime的時(shí)間間隔
- oTime:相對(duì)時(shí)間帚戳,dateTimestamp函數(shù)返回的對(duì)象類型
- return:浮點(diǎn)類型,時(shí)間間隔儡首,單位毫秒
- 注:dateTimestamp和dateTimestampDiff配對(duì)使用
example
var timeProvider = require('@tars/utils').timeProvider;
var i = 0, count = 10000000;
var tt1, tt2, interval = 0;
var t1 = new Date().getTime();
var t2 = t1;
tt1 = timeProvider.nowTimestamp();
for(i = 0; i < count; i++) {
tt2 = timeProvider.dff(tt1);
}
t2 = new Date().getTime();
console.log('【hrTime】interval: ' + (t2 - t1));
t1 = new Date().getTime();
tt1 = timeProvider.dateTimestamp();
for(i = 0; i < count; i++) {
tt2 = timeProvider.dateTimestampDiff(tt1);
}
t2 = new Date().getTime();
console.log('【hrTime】interval: ' + (t2 - t1));
具體例子參見(jiàn)examples目錄下的test-timer.js文件
03.Promise庫(kù)
var Promise = require('@tars/utils').promise;
為T(mén)ARS應(yīng)用提供一個(gè)方便統(tǒng)一的Promise庫(kù)片任。開(kāi)發(fā)TARS應(yīng)用時(shí)推薦大家使用此庫(kù)而不是自己選擇Promise庫(kù),當(dāng)出現(xiàn)更好的promise方案時(shí)椒舵,我們可以直接替換此模塊中的實(shí)現(xiàn)蚂踊,直接對(duì)所有應(yīng)用生效。
var Promise = require('@tars/utils').Promise;
var promise = new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(666)
}, 3000);
});
promise.then(function(data) {
console.log(data);
});
目前TARS中的Promise是基于bluebird庫(kù)實(shí)現(xiàn)的笔宿,在q犁钟、bluebird、原生Promise中bluebird性能最好泼橘。
winston-tars
基于 winston 的擴(kuò)展涝动,以提供符合 TARS 框架的日志格式與輸出
@tars/winston-tars
@tars/winston-tars提供基于winston的TARS擴(kuò)展,以提供符合TARS框架的日志格式與輸出炬灭,在@tars/winston-tars中提供3種transport對(duì)象:
- TarsBase: 提供符合TARS日志的基礎(chǔ)類
- TarsRotate: 提供按大小輸出的滾動(dòng)日志
-
TarsDate: 提供按日期輸出的日志
并提供一種自定義日志級(jí)別: - TarsConfig: 提供符合TARS框架標(biāo)準(zhǔn)的日志級(jí)別和顏色值
以及相關(guān)的輔助方法: - Formatter: 提供了符合TARS日志格式標(biāo)準(zhǔn)的內(nèi)容格式化方法
-
Date-Format: 定義了與時(shí)間相關(guān)日志滾動(dòng)的處理方法
請(qǐng)注意:如果您的服務(wù)在TARS平臺(tái)上運(yùn)行醋粟,應(yīng)直接使用@tars/logs模塊,更為便捷
安裝
npm install @tars/winston-tars
使用
var winston = require('winston');
// Require `@tars/winston-tars` will expose
// transports
// `winston.transport.TarsRotate`
// `winston.transport.TatsDate`
// config
// `winston.config.tars.levels`
// `winston.config.tars.colors`
require('@tars/winston-tars');
日志格式
對(duì)于支持formatter的transport對(duì)象重归,@tars/winston-tars提供2種方法格式化日志內(nèi)容:
- 詳細(xì)日志:Formatter.Detail([options])
-
精簡(jiǎn)日志:Formatter.Simple([options])
options - separ: 日志內(nèi)容項(xiàng)與項(xiàng)之間的分隔符米愿,默認(rèn)為|
詳細(xì)日志:
var winston = require('winston');
var winstonTars = require('@tars/winston-tars');
var logger = new (winston.Logger) ({
transports: [
new (winston.transports.Console)({
formatter: winstonTars.Formatter.Detail();
})
]
});
輸出日志的格式為:日期 時(shí)間|PID|日志級(jí)別|文件名與行號(hào)|內(nèi)容
其中:文件名與行號(hào) 部分可選(詳見(jiàn)Metadata節(jié))
精簡(jiǎn)日志
var winston = require('winston');
var winstonTars = require('@tars/winston-tars');
var logger = new (winston.Logger) ({
transports: [
new (winston.transports.Console)({
formatter: winstonTars.Formatter.Simple();
})
]
});
輸出日志的格式為:日期 時(shí)間|內(nèi)容
TarsConfig
winston.config.tars提供了符合TARS框架標(biāo)準(zhǔn)的日志級(jí)別(levels)與顏色(colors)
TARS框架的日志級(jí)別從低到高(及其對(duì)應(yīng)的顏色)為:
- info: white
- debug: cyan
- warn: yellow
- error: red
- none: grey
在使用時(shí)需要主動(dòng)引入:
logger.setLevels(winston.config.tars.levels);
winston.addColors(winston.config.tars.colors);
TarsBase
此模塊可單獨(dú)使用,也可作為其他日志模塊的基類鼻吮。
模塊實(shí)現(xiàn)了與現(xiàn)有TARS日志類似的管理方式:
- 定時(shí)重新打開(kāi)日志文件育苟,以便獲取fd的變更。(當(dāng)用戶刪除/移動(dòng)當(dāng)前文件后椎木,模塊會(huì)自動(dòng)創(chuàng)建文件)
- 在文件打開(kāi)的過(guò)程中违柏,產(chǎn)生的日志將會(huì)寫(xiě)入臨時(shí)內(nèi)存隊(duì)列博烂,等待文件打開(kāi)完成后一次性寫(xiě)入。(只要不超過(guò)隊(duì)列最大長(zhǎng)度漱竖,所有日志均會(huì)寫(xiě)入文件)
- 此模塊使用文件名options.filename作緩存禽篱,所以使用相同的options.filename多次實(shí)例化此模塊僅會(huì)產(chǎn)生一個(gè)單例(共享一個(gè)實(shí)例)
獨(dú)立使用
winston.add(winston.transports.TarBase, options)
options:
- filename: 輸出的文件名
- interval: 重新打開(kāi)日志文件的間隔,默認(rèn)值為5000ms
- bufferSize: 臨時(shí)隊(duì)列的最大長(zhǎng)度(單位為 條)馍惹,默認(rèn)值為10000條
- prefix: 每條日志內(nèi)容前綴躺率,默認(rèn)值為空
- formatter:定義日志內(nèi)容格式化方法,默認(rèn)值為Formatter.Detail()
作為其他類的基類
需要重寫(xiě)如下2個(gè)對(duì)象:
- TarsBase.prototype.name: Transport 模塊名
- TarsBase.prototype._checkfile(callback):當(dāng)重新打開(kāi)日志文件時(shí)會(huì)調(diào)用此函數(shù)万矾,函數(shù)處理完成之后肥照,應(yīng)顯式調(diào)用callback([err])
例如:
var TarsFile = function (options) {
var instance = TarsBase.call(this, options);
// 由于父類存在緩存,所以這里需判斷父類是否有返回值勤众,如果存在(命中緩存)則則直接返回?zé)o需繼續(xù)初始化
if (instance) {
return instance;
}
// 業(yè)務(wù)代碼
};
util.inherits(TarsFile, TarsBase);
TarsFile.prototype.name = 'TarsFile';
TarsFile.prototype._checkfile = function(cb) {
// 業(yè)務(wù)代碼
cb();
};
winston.transports.TarsFile = TarsFile;
TarsRotate
此模塊繼承于TarsBase
提供按文件大小輸出的滾動(dòng)日志
當(dāng)?shù)竭_(dá)設(shè)定的最大大小時(shí),會(huì)自動(dòng)向下滾動(dòng)鲤脏,并創(chuàng)建一個(gè)新的日志文件们颜。
例如:app.log文件寫(xiě)到最大大小,則將會(huì)執(zhí)行如下過(guò)程:
delete app_n.log
app_n-1.log ===> app_n.log
... ...
app_1.log ===> app_2.log
app.log ===> app_1.log
create app.log
winston.add(winston.transports.TarsRotate, options)
options:
- filename: 輸出的文件名
- maxFiles: 最大的文件總數(shù)(也就是例子中的n)猎醇,默認(rèn)值為10
- maxSize: 單文件最大大锌弧(單位為bytes),默認(rèn)值為10M
- concatStr: 日志文件名中字符間的連接符硫嘶,默認(rèn)值為_(kāi)
-
formatter: 定義日志內(nèi)容格式化方法阻问,默認(rèn)值為Formatter.Detai()
TarsRotate.Master
如果業(yè)務(wù)腳本通過(guò)Cluster(多進(jìn)程方式啟動(dòng)的):Worker則只負(fù)責(zé)寫(xiě)入文件,而移動(dòng)文件由Master完成沦疾,以剞劂多進(jìn)程資源競(jìng)爭(zhēng)問(wèn)題称近。
當(dāng)服務(wù)進(jìn)程(Worker)打開(kāi)日志文件準(zhǔn)備寫(xiě)入時(shí),會(huì)向主進(jìn)程發(fā)送消息哮塞,如下:
{
cmd : 'log:rotate',
msg : {
filename : String, // 文件名
interval : Number, // 多久打開(kāi)一回文件
maxFiles : Number, // 最大文件數(shù)
maxSize : Number, // 最大單個(gè)文件大小
concatStr : string // 日志文件名中間字符的連接符
}
}
主進(jìn)程(Master)收到消息后刨秆,需透?jìng)鹘oTarsRotate。Master.start方法忆畅,完整的例子如下:
worker.on('message', function(msg) {
if (msg && typeof msg == 'object' && msg.cmd == 'log:rotate') {
var data = msg.msg;
TarsRotate.Master.start(data.filename, data.interval, data.maxFiles, data.maxSize, data.concatStr);
}
});
process.on('exit', function() {
TarsRotate.Master.close();
});
···
**如果服務(wù)通過(guò)node-agent(或在TARS平臺(tái))運(yùn)行衡未,則無(wú)需配置平臺(tái)運(yùn)行,無(wú)需顯式調(diào)用此模塊家凯。只需按照平時(shí)的寫(xiě)法console.[log|info|warn|error]即可正確的輸出滾動(dòng)日志**
######DateFormat
定義了與時(shí)間相關(guān)的日志(TarsDate)滾動(dòng)的處理方法:
+ 按1天日志:LogByDay([interval, pattern])
+ **interval**: 1 每隔一天滾動(dòng)一份日志
+ **pattern**: %Y%m%d 年月日(如:20150101)
+ 按1小時(shí)日志:LogByHour([interval, pattern])
+ **interval**: 1 每隔一小時(shí)滾動(dòng)一份日志
+ **pattern**: %Y%m%d 年月日(如:2015010110)
+ 按10分鐘日志:LogByHour([interval, pattern])
+ **interval**:每隔十分鐘滾動(dòng)一份日志
+ **pattern**:%Y%m%d%H%M 年月日小時(shí)分鐘(如:201501011020)
+ 自定義格式日志:LogByCustom(pattern)
+ **pattern**:需要用戶自定義
其中pattern為日志文件名中的時(shí)間格式缓醋,可參見(jiàn) linux strftime
######例子
每隔1天滾動(dòng)一份日志
```javascript
DateFormat.LogByDay
或者
new DateFormat.LogByDay()
每隔20分鐘滾動(dòng)一份日志
new DateFormat.LogByMinute(20)
每隔20分鐘滾動(dòng)一份日志,文件名中時(shí)間格式為%Y-%m-%d_%H:%M
···javascript
new DateFormat.LogByMinute(20, %Y-%m-%d_%H:%M)
######TarsDate
此模塊繼承于TarsBase
提供按日期(年绊诲、月送粱、日、小時(shí)驯镊、分)輸出的日志
當(dāng)?shù)竭_(dá)設(shè)定的時(shí)間間隔時(shí)葫督,會(huì)自動(dòng)創(chuàng)建一個(gè)新的日志文件
輸出的文件名的格式為:filename_[%Y|%m|%d|%H|%M].log竭鞍,
如:app_20141015.log
```javascript
winston.add(winston.transports.TarsDate, options)
options:
- filename:輸出的文件名
- concatStr:日志文件名中字符間的連接符,默認(rèn)值為_(kāi)
- format:創(chuàng)建新文件的間隔橄镜,為DateFormat對(duì)象偎快,默認(rèn)值為FORMAT.LogByDay
-
formatter:定義日志內(nèi)容格式化方法,默認(rèn)值為Formatter.Simple()
為了方便使用TarsDate.FORMAT = DateFormat
Metadata
通過(guò)指定Metadata可輸出2種附加數(shù)據(jù)洽胶。
pid
通過(guò)pid屬性晒夹,可以指定日志輸出條目中進(jìn)程id部分,默認(rèn)情況下為process.pid
如:
logger.info('data', {
pid : 123456
});
則輸出:
2015-01-01 00:00:01|123456|INFO|data
lineno
通過(guò)lineno屬性姊氓,可以指定日志輸出條目中文件名與行號(hào)部分丐怯,默認(rèn)值為空(也就是不輸出這一節(jié))。
如:
logger.info('data', {
lineno : 'app.js:6'
});
則輸出:
2015-01-01 00:00:01|123456|INFO|app.js:6|data
notify
TARS 框架中用于業(yè)務(wù)的(告警)消息上報(bào)
@tars/notify
上報(bào)業(yè)務(wù)(框架)消息(告警)至TARS平臺(tái)翔横。
report(message[, id])
將消息上報(bào)到平臺(tái)上读跷,并可以在WEB管理頁(yè)面上查看到。
- message: 消息內(nèi)容(必填)
- id: 服務(wù)線程(進(jìn)程)ID禾唁,默認(rèn)值為process.id
notify(message[, level, id])
上報(bào)通知信息到平臺(tái)效览。
- message: 通知內(nèi)容(必填)
- level: 通知內(nèi)容的級(jí)別,為L(zhǎng)EVEL枚舉荡短,默認(rèn)值為L(zhǎng)EVEL.NOTIFYNORMAL
- id: 服務(wù)線程(進(jìn)程)ID丐枉,默認(rèn)值為process.pid
LEVEL 枚舉中有3項(xiàng)可選: - LEVEL.NOTIFYNORMAL:正常(默認(rèn))
- LEVEL.NOTIFYWARN:警告
- LEVEL.NOTIFYERROR:錯(cuò)誤
如果level的級(jí)別為L(zhǎng)EVEL.NOTIFYERROR,則會(huì)進(jìn)行短信告警掘托,平臺(tái)每10分鐘對(duì)上報(bào)的異常進(jìn)行收斂告警瘦锹。
logs
TARS 框架規(guī)范的日志組件,包含滾動(dòng)(大小闪盔、時(shí)間)與染色日志
@tars/logs
基于winston與winston-tars開(kāi)發(fā)弯院,符合TARS框架規(guī)范的日志組件,其中包含染色日志泪掀、滾動(dòng)(大小抽兆、時(shí)間)日志。
安裝
npm install @tars/logs
例子
輸出滾動(dòng)日志
var logger = new tarsLogs('TarsRotate');
輸出名為access的按天日志
var logger = new tarsLogs('TarsDate', 'access');
輸出名為access的按小時(shí)日志
var logger = new tarsLogs('TarsDate', 'access', {
format : tarsLogs.DateFormat.LogByHour
});
輸出名為access的按20分鐘滾動(dòng)的日志族淮,文件名為2015-01-01_10:00這樣的格式
var logger = new tarsLogs('TarsDate', 'access', {
format: new (tarsLogs.Dateformat.LogByMinute)(20, '%Y-%m-%d_%H:%M')
});
指定輸出INFO級(jí)別的日志信息
logger.info('data');
logger.info('data1', 'data2', 'data3');
指定當(dāng)前INFO級(jí)別的日志輸出需要染色
logger.info('data', logger.getDyeingObj(true));
初始化
如果服務(wù)在TARS平臺(tái)上運(yùn)行辫红,則無(wú)需配置此項(xiàng)
如果服務(wù)在本地環(huán)境中調(diào)試,所有日志類型都講輸出至Console
可以通過(guò)調(diào)用tarsLogs.setConfig(data)靜態(tài)方法進(jìn)行初始化
data(String|Object)可作為tars配置文件路徑或已配置的(@tars/utils).Config實(shí)例祝辣。
使用
實(shí)例化
var tarsLogs = require('@tars/logs');
var logger = new tarsLogs(type, [name, options]);
type(String)日志類型:
- TarsRotate: 按大小滾動(dòng)日志
-
TarsDate: 按時(shí)間滾動(dòng)日志
name(String)用戶自定義的文件名(可不填)
options(Object)根據(jù)不同的日志類型贴妻,存在不同的參數(shù),但下面的參數(shù)是各類型共享的: - hasSufix: 日志文件名是否帶.log后綴蝙斜,默認(rèn)值為true
- hasAppNamePrefix: 是否允許框架在日志文件名上增加業(yè)務(wù)相關(guān)的標(biāo)識(shí)名惩,默認(rèn)值為true
- concatStr: 日志文件名中字符間的連接符,默認(rèn)值為_(kāi)
-
separ: 日子內(nèi)容項(xiàng)之間的分隔符孕荠,默認(rèn)值為|
options中的其它參數(shù)娩鹉,請(qǐng)?jiān)敽?jiǎn)不同日志類型的說(shuō)明項(xiàng)攻谁。
在正常情況下,相同一個(gè)日志文件應(yīng)該共享相同的一個(gè)logger弯予,而不是多次進(jìn)行實(shí)例化
日志輸出
在TARS中存在4種日志級(jí)別INFO戚宦、DEBUG、WARN锈嫩、ERROR可用對(duì)應(yīng)的方法進(jìn)行輸出
logger.info([data], [...]);
logger.debug([data], [...]);
logger.warn([data], [...]);
logger.error([data], [...]);
方法支持多重參數(shù)受楼,詳情可見(jiàn)util.format()
如需要染色,詳見(jiàn)染色節(jié)
文件名與行號(hào)
默認(rèn)情況下呼寸,輸出的日志中包含調(diào)用輸出方法的代碼所在的 文件名:行號(hào)艳汽。
可通過(guò)如下示例進(jìn)行自定義(用于封裝模塊)或者關(guān)閉(以提高性能)。
關(guān)閉文件名與行號(hào)輸出:
logger.info('data', {
lineno : false
});
自定義文件名與行號(hào)輸出:
logger.info('data', {
lineno : 'app.js:123'
});
更多詳細(xì)信息对雪,請(qǐng)參考@tars/winston-tars.Metadata
日志級(jí)別
日志級(jí)別的優(yōu)先級(jí)為:INFO < DEBUG < WARN < ERROR < NONE
其中河狐,除了按大小滾動(dòng)日志(TarsRotate)默認(rèn)級(jí)別為DEBUG,其他均為INFO瑟捣。
如需變更日志級(jí)別甚牲,可調(diào)用logger.setLevel(level)方法,傳入需要的日志級(jí)別即可:
logger.setLevel('info');
logger.setLevel('none'); // none為一種特殊的日志級(jí)別蝶柿,所有日志均不輸出
如果服務(wù)在TARS平臺(tái)上運(yùn)行:
- 模塊會(huì)接收日志級(jí)別變更的管理命令,自動(dòng)變更當(dāng)前日志級(jí)別非驮。
- 模塊會(huì)讀取TARS配置文件中tars.application.server.logLevel節(jié)交汤,以配置日志級(jí)別。
- 以上兩項(xiàng)日志級(jí)別的配置僅針對(duì)按大小滾動(dòng)日志(TarsRotate)生效劫笙。
日志內(nèi)容格式(Formatter)
模塊提供精簡(jiǎn)Formatter.Simple()與復(fù)雜Formatter.Detail()兩種日志處理方法:
- 復(fù)雜:日期 時(shí)間|PID|日志級(jí)別|文件名與行號(hào)|內(nèi)容
-
精簡(jiǎn):日期 時(shí)間|內(nèi)容
默認(rèn)情況下芙扎,不同類型的日志會(huì)使用不同的處理方法。
關(guān)于Formatter的詳情填大,請(qǐng)?jiān)L問(wèn)@tars/winston-tars.Formatter
#######按大小滾動(dòng)日志(TarsRotate)
在初始化類型為T(mén)arsRotate的logger時(shí)戒洼,options還接受如下參數(shù): - maxFiles: 最大的文件總數(shù)(也就是例子中的n),默認(rèn)值為10
- maxSize: 單文件最大大性驶(單位為bytes)圈浇,默認(rèn)值為10M
-
formatter: 定義日志內(nèi)容格式化方法,默認(rèn)值為Formatter.Detail()
關(guān)于TarsRotate的詳情靴寂,請(qǐng)?jiān)L問(wèn)@tars/winston-tars.TarsRotate
時(shí)間相關(guān)(DateFormat)
定義了與時(shí)間相關(guān)的日志(TarsDate)滾動(dòng)的處理方法:
- 按1天日志:LogByDay([interval, pattern])
- 按1小時(shí)日志:LogByHour([interval, pattern])
- 按10分鐘日志:LogByMinute([interval, pattern])
- 自定義格式日志:LogByCustom(pattern)
其中磷蜀,interval為日志滾動(dòng)間隔,pattern為日志文件名中時(shí)間的格式
一般情況下百炬,可直接使用字面量:
var logger = new tarsLogs('TarsDate', 'access', {
format : tarsLogs.DateFormat.LogByDay
});
但如果需要自定義間隔或日志文件名褐隆,則需要實(shí)例化:
var logger = new tarsLogs('TarsDate', 'access', {
format : new tarsLogs.DateFormat.LogByDay(3, '%Y-%m-%d');
});
關(guān)于DateFormat的詳情,請(qǐng)?jiān)L問(wèn)@tars/winston-tars.DateFormat
按時(shí)間滾動(dòng)日志(TarsDate)
在初始化類型為T(mén)arsDate的logger時(shí)剖踊,options還接受如下參數(shù):
- format:創(chuàng)建新文件的間隔庶弃,為DateFormat對(duì)象衫贬,默認(rèn)值為FORMAT.LogByDay
-
formatter:定義日志格式化方法,默認(rèn)值為Formatter.Simple()
關(guān)于TarsDate的詳情歇攻,請(qǐng)?jiān)L問(wèn):@tars/winston-tars.TarsDate
染色
在每一條日志寫(xiě)入時(shí)可以制定是否需要對(duì)此日志進(jìn)行染色(也就是說(shuō)固惯,染色的開(kāi)關(guān)并不在初始化時(shí)而在日志寫(xiě)入時(shí))。
僅有按大小滾動(dòng)(TarsRotate)與按時(shí)間滾動(dòng)(TarsDate)輸出的日志可以進(jìn)行染色掉伏。
染色的日志不僅按照之前邏輯進(jìn)行輸出缝呕,也會(huì)按照相同的邏輯會(huì)多輸出一份放在$LOG_PATH$/tars_dyeing/目錄下。
染色日志總是全量輸出(忽略當(dāng)前日志級(jí)別進(jìn)行輸出)斧散。
染色對(duì)象
染色對(duì)象標(biāo)識(shí)了當(dāng)前染色的狀態(tài)(是否需要染色及附加信息)恋日。
染色對(duì)象需要通過(guò)@tars/dyeing提供的方法生成村象。
為了便于使用,本模塊封裝了染色對(duì)象的生成方式“亲睿可通過(guò)logger.getDyeingObj()來(lái)獲取染色對(duì)象。
打開(kāi)染色:
logger.getDyeingObj(true);
打開(kāi)染色并設(shè)置染色的val為guid贤姆,ket為guid|sn
logger.getDyeingObj(true, 'guid', 'guid|sn');
實(shí)際應(yīng)用中渔欢,不應(yīng)調(diào)用此方法生成染色對(duì)象,而應(yīng)直接使用其他模塊提供的染色對(duì)象
符合染色標(biāo)準(zhǔn)的其它模塊色迂,均會(huì)提供Object.getDyeingObj()方法香缺,可通過(guò)調(diào)用它獲取染色對(duì)象,而不是使用此模塊的方法歇僧。
關(guān)于染色的詳細(xì)信息图张,請(qǐng)?jiān)L問(wèn)@tars/dyeing獲取。
使用
需要對(duì)某條日志進(jìn)行染色時(shí)诈悍,需在調(diào)用logger特定方法(日志級(jí)別)的最后一個(gè)參數(shù)傳入染色對(duì)象祸轮。
輸出日志內(nèi)容為data1 data2并強(qiáng)制染色的日志
logger.info('data1', 'data2', logger.getDyeingObj(true));
輸出日志內(nèi)容為data并根據(jù)rpc.server調(diào)用鏈上的染色信息進(jìn)行染色的日志
tars.TestImp.prototype.echo = function (current, i) {
logger.info('data', current.getDyeingObj());
}
rpc具體獲取染色對(duì)象的方式,請(qǐng)?jiān)斠?jiàn)@tars/rpc
config
TARS 框架中用于獲取服務(wù)配置文件
@tars/config
安裝
npm install @tars/config
使用
var tarsConfigHelper = require("@tars/config");
var tarsConfig = new tarsConfigHelper(options);
options
如果服務(wù)通過(guò)node-agent(或在TARS平臺(tái))運(yùn)行侥钳,則無(wú)需填寫(xiě)适袜。
- app:tars.app名稱
- server:服務(wù)名稱
方法調(diào)用
事先說(shuō)明,以下幾個(gè)方法調(diào)用舷夺,configOptions可以是一個(gè)object苦酱,包含以下參數(shù)。
struct ConfigInfo {
// 業(yè)務(wù)名稱 0
require string appname;
// 服務(wù)名稱 1
require string servername;
// 配置文件名稱 2
require string filename;
// 是否只獲取應(yīng)用配置给猾,默認(rèn)為false躏啰,如果為true則servername可以為空 3
require bool bAppOnly = false;
// 服務(wù)所在節(jié)點(diǎn)(ip) 4
optional string host;
// set分組名稱 5
optional string setdivision;
};
所有的放大調(diào)用均返回[Promise]對(duì)象。
loadConfig(configOptions[, configFormat])
獲取配置文件內(nèi)容
configOptions:{string/object} tars配置文件名或一個(gè)Object(見(jiàn)上面configOptions說(shuō)明)configFormat:轉(zhuǎn)換格式耙册,如果不轉(zhuǎn)给僵,每個(gè)配置項(xiàng)直接返回字符串。"json:"自動(dòng)轉(zhuǎn)為json格式,"c":c++格式的配置項(xiàng)
tarsConfig.loadConfig("Server.conf").then(function (data) {
console.log("loadConfig back", data);
}, function (err) {
console.log("loadConfig err", err);
});
getConfigList(configOptions)
獲取配置文件列表
configOptions:{string/object} tars配置文件名或者一個(gè)Object(見(jiàn)上面configOptions說(shuō)明)帝际,也可以不傳蔓同,那么就直接使用默認(rèn)的app和server。
tarsConfig.getConfigList().then(function(configList) {
console.log("examples:getConfigList back", configList);
},
function(err) {
console.error("getConfigList error", err);
});
getAllConfigData([configOptions, configFormat])
獲取配置文件列表以及配置項(xiàng)的內(nèi)容
configOptions:{string/object} tars配置文件名或者一個(gè)Object(見(jiàn)上面configOptions說(shuō)明)蹲诀,可缺省斑粱。configFormat:{string}轉(zhuǎn)換格式,默認(rèn)配置項(xiàng)直接返回字符串脯爪。"json:"自動(dòng)轉(zhuǎn)為json格式则北,"c":c++格式的配置項(xiàng)
返回的對(duì)象內(nèi),key:文件名痕慢,value:文件內(nèi)容
tarsConfig.getAllConfigData().then(function(configDatas) {
console.log("examples:getAllConfigData back", configDatas);
},
function(err) {
console.error("getAllConfigData error", err);
});
setTimeout(iTimeout)
設(shè)置調(diào)用超時(shí)時(shí)間尚揣,默認(rèn)是30s,參數(shù)單位為ms
loadServerObject(configFormat)
加載服務(wù)默認(rèn)的配置項(xiàng)掖举,并且轉(zhuǎn)換為json
configFormat: {string} "c": c++ 格式的配置項(xiàng)(默認(rèn)值)快骗,"json": json格式配置項(xiàng)返回的對(duì)象內(nèi),key:文件名塔次,value:文件內(nèi)容
tarsConfig.loadServerObject().then(function() {
console.log("serverObject", serverObject);
});
事件支持
configPushed
從TARS配置平臺(tái)push配置文件的時(shí)候方篮,觸發(fā)此事件
tarsConfig.on("configPushed", function(filename, content) {
console.log("config pushed", filename, content);
});
dyeing
TARS 染色基礎(chǔ)模塊
@tars/dyeing
TARS染色基礎(chǔ)模塊,提供獲取與判斷染色對(duì)象的方法励负。
使用者:不應(yīng)該直接使用此模塊藕溅,而應(yīng)使用其他符合染色標(biāo)準(zhǔn)的模塊獲取染色對(duì)象
模塊開(kāi)發(fā)者:獲取TARS染色對(duì)象,應(yīng)使用此模塊的gen()方法獲取染色對(duì)象
染色(簡(jiǎn)介)
染色是在接口的調(diào)用鏈(服務(wù)端<==>客戶端)上傳遞的一種狀態(tài)继榆,用于標(biāo)識(shí)一次特定的請(qǐng)求處理過(guò)程巾表。
這種狀態(tài)由一個(gè)標(biāo)志位與附加信息KEY(可選)構(gòu)成。
調(diào)用鏈上的服務(wù)可以設(shè)置(發(fā)起)與讀取(接收)這種狀態(tài)裕照,并作對(duì)應(yīng)的處理(如輸出對(duì)應(yīng)的日志、特性)调塌。
在系統(tǒng)中晋南,染色由此模塊與其對(duì)應(yīng)的約定構(gòu)成。
標(biāo)準(zhǔn)(約定)
如模塊使用染色體系羔砾,則需遵守如下約定(與此同時(shí)负间,我們將符合約定的模塊稱之為符合染色標(biāo)準(zhǔn)的模塊)
- 提供getDyeingObj()方法,返回染色對(duì)象姜凄。
- 通過(guò)@tars/dyeing.gen()方法政溃,生成染色對(duì)象。
- 通過(guò)@tars/dyeing.is()方法态秧,判斷染色對(duì)象是否有效董虱。
模塊方法
TarsDyeing.gen(dyeing[, key, args])
通過(guò)調(diào)用此方法,可獲得染色對(duì)象:
dyeing:是否需要染色
key:染色添加附加信息KEY(可選)
args:程序的附加參數(shù)(可選)
key會(huì)通過(guò)調(diào)用鏈傳遞給下一個(gè)服務(wù),而args僅只會(huì)在當(dāng)前的染色對(duì)象中有效(并不會(huì)進(jìn)行傳遞)
請(qǐng)注意:染色對(duì)象與染色發(fā)起原因愤诱,這是不同的(東西)云头。此模塊僅關(guān)心染色對(duì)象,而不關(guān)心染色發(fā)起原因淫半。
TarsDyeing.is(obj)
調(diào)用此方法溃槐,可以判斷一個(gè)傳入的對(duì)象是否是染色對(duì)象。
如傳入空對(duì)象科吭,方法同樣返回false
染色對(duì)象 屬性
dyeingObj.dyeing
是否需要染色昏滴,此為Boolean
dyeingObj.key
染色傳遞的附加信息,此為String且可選值对人,不一定存在
dyeingObj.args
染色對(duì)象本身的附加信息谣殊,業(yè)務(wù)代碼不應(yīng)將其在服務(wù)間進(jìn)行傳遞(僅作為本地參數(shù)使用)。此對(duì)象類型不限规伐,同時(shí)也為可選值