在开发微信小程序时,遇到如下报错内容。在请求服务器接口时,接口返回aes加密串,在解密aes的时候,总是报下面的错,接收的aes密文用工具解析正常,可以解出来,就是在小程序中就报如下错误:
小程序报错:
thirdScriptError
Unexpected end of JSON input;at pages/index/index onLoad function;at api request success callback function
SyntaxError: Unexpected end of JSON input
服务端响应报文:
请求响应结果res==> {"data":"F69B8996A11E12B5E7B253636CEA1038975C82DB00937D18710241C102655C9DAE029B040CCC085E30281D9AE5ED4B9E2D59CF2A618DABE2F4F6BD18728FD2B26F8938C7D762EFCB9E55D11D149F9524\n","header":{"Server":"nginx","Date":"Thu, 12 Apr 2018 02:23:50 GMT","Content-Type":"text/html","Content-Length":"160","Connection":"keep-alive"},"statusCode":200,"errMsg":"request:ok"}
由上可见data数据后面多了\n ,但是在小程序里获取这个响应包data里的数据是这样的,如下:
let respData = res.data
console.log("respData ==" + respData )
//打印结果如下:
F69B8996A11E12B5E7B253636CEA1038975C82DB00937D18710241C102655C9DAE029B040CCC085E30281D9AE5ED4B9E2D59CF2A618DABE2F4F6BD18728FD2B26F8938C7D762EFCB9E55D11D149F9524
这时候获取到的data密文没有\n ,这时候我就认为这个data是正常的,没有什么格式错误,就直接aes去解这个密文
let resp = JSON.parse(aes.decrypt(res.data))
console.log("resp==" + JSON.stringify(resp))
//这时候就出现了如下问题:
thirdScriptError
Unexpected end of JSON input;at pages/index/index onLoad function;at api request success callback function
SyntaxError: Unexpected end of JSON input
各种尝试,拿着报文工具解析正常,服务端解析正常,就是小程序解析出问题,用了整整一天时间,最后考虑到这个\n ,这个表示换行,如果打印可能是不显示的,看不来的,但是打印这个字符串长度可以看出来,这个\n依然是存在的,可以实际打印一下这个密文字符串长度,我这里就不贴出来了,比实际字符串长度长了1位,于是用substr方法去截取,可是截出来还是不能解析,于是用下面的办法解决掉了,去掉密文中的回车换行空格等格式
util.js
let formatString = function (str){
if (typeof(str) != "string"){
console.log('去除回车换行空格失败!参数不是字符串类型')
return;
}
str = str.replace(/\ +/g, "");//去掉空格
str = str.replace(/[\r\n]/g, "");//去掉回车换行
return str;
}
module.exports = {
formatString: formatString,
}
index.js
var utils = require('../../utils/util')
var aes = require('../../common/aesTool')
//这是请求成功后的success函数
success: function (res) {
let resp = JSON.parse(aes.decrypt(utils.formatString(res.data)))
console.log("resp==" + JSON.stringify(resp))
}
问题完美解决,就是去掉了密文中的换行\n ,这样解aes正常解出来,不再报错了