msgpack使用记录

我们平时做接口调接口,总会遇到一些接口返回的数据量特别庞大的问题,这容易导致客户端流量增加,也影响响应时间。msgpack可以将数据压缩,通过msgpack,我们一般可以讲原始数据压缩一半左右,当数量很大时,非常赞!
步骤也很简单,如下:
1.安装模块

1
npm install msgpack5 --save

2.压缩/解压

1
let msgpack = require('msgpack5')()
  , encode  = msgpack.encode
  , decode  = msgpack.decode;

console.log(decode(encode({ 'hello': 'world' }))) // { hello: 'world' }

encode的结果是Buffer对象,你可以直接返回二进制编码,也可以通过toString(‘hex’)返回十六进制编码。

1
// 返回二进制
this.body = encode({ 'hello': 'world' });
// 返回十六进制
this.body = encode({ 'hello': 'world' }).toString('hex');

如果你用二进制,用request测试,记得必须将encoding设为null

1
request({
	method: 'post',
	url:'http://localhost:3000/sign_in', 
	form: {account: '11111121123', password: '123456'},
	encoding: null
}, function(err, res, body) {
	if (err) throw err;
	console.log(msgpack.decode(body));
})

如果你用十六进制,需要将结果转为二进制后才能正常解码。

1
request({
	method: 'post',
	url:'http://localhost:3000/sign_in', 
	form: {account: '11111121123', password: '123456'},
}, function(err, res, body) {
	if (err) throw err;
	console.log(msgpack.decode(Buffer(body, 'hex')));
})

注意 对数据进行encode操作的时候,如果encode的内容是类似于mongoose返回的实体对象这一类的数据的话,这个对象是存在某些读写限制的,encode遇到这类数据后抛出not implemented yet的异常。如果是mongoose的实体对象,可以使用其内置的toObject方法将对象转换为普通对象再执行encode操作。

文章目录
,