qs.stringify和encodeURICompoent、decodeURIComponent

记一些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。

你可能感兴趣的:(qs.stringify和encodeURICompoent、decodeURIComponent)