我们平时做接口调接口,总会遇到一些接口返回的数据量特别庞大的问题,这容易导致客户端流量增加,也影响响应时间。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设为null1
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操作。