记一些qs.stringify和encodeURICompoent、decodeURIComponent的坑。
今天出了一个生产问题。
把参数转成base64之后,因为别的项目中遇到过转成base64有+,接收方就解析出了错误的base64,并且还把一部分信息丢失了。因此就想着优化一样,对它进行encodeURICompoent。
年前改的这个代码,记得自己当时在本地是测过的。
年后隔离了几天之后来上班,第二天就说要上线,也没有人测过,不知不觉上了测试、回归。
然后也就这么上线了。结果,事故来了。
因为加了一个encodeURICompoent,就把之前接受的代码改了
原本是这样的:var obj = getUrlObj(decodeURIComponent(base64.decode(getUrlParam('params'))));
我改成了这样:
var obj = getUrlObj(base64.decode(decodeURIComponent(getUrlParam('params'))));
结果,base64解码之后的内容是乱码的。也就是被编码过的。
按逻辑来看,这样没问题。
也没有人测过,只能自己默默的背锅、反省。
思来想去,base64编码的是什么,解码之后应该就是什么啊,那就是编码的内容就已经是被编码过的。
发现base64编码的是用node的qs模块stringify的,就把它改成了JSON.stringify。发现木有问题!
应该确定是它的问题了
原来它默认是会对内容编码的,但是可以配置。
1、encode:false
2、encodeValuesOnly:true. // 只编码值
3、对undefined和null的处理(默认会忽略值为undefined的key)
qs.stringify({a:undefined});// ""
qs.stringify({a:undefined},{
filter:function(key, value){
return value === undefined ? "undefined":value // 返回undefined会被忽略
});
// "a=undefined"
4、区分null和‘’
qs.stringify({a:null, b:''}). // 'a=&b='
qs.stringify({a:null, b:''},{strictNullHanding:true}). // 'a=null&b='
5、跳过null
qs.stringify({a:null, b:''},{skipNulls:true). // 'b='
6、默认空对象和空数组会忽略
7、还有处理数组
qs.stringify({ a: ['b', 'c', 'd'] },{encodeValuesOnly:true});// 'a[0]=b&a[1]=c&a[2]=d'
生成表单提交时的样子:
qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false }); // "a=b&a=c&a=d"
qs.stringify({ a: ['b', 'c','d'] }, { arrayFormat: 'repeat' }) // "a=b&a=c&a=d"
8、qs.stringify可以指定encoder;qs.parse可以指定decoder。
摘自:https://www.meiwen.com.cn/subject/ofhqxhtx.html
所以解决方案就是加上第二个参数{encode:false}
或者多加一个decodeURIComponent。