问题重现:
1. 我这里的客户端是Android手机,但是我相信浏览器和iOS也是一样的。
2. 服务器是Node.js Express App, 使用了body-parser的中间件,所以报错信息是从body-parser里面抛出来的。
服务器的报错信息:
SyntaxError: Unexpected token u
at Object.parse (native)
at parse (/Users/STarLiu/WebstormProjects/Realtime/node_modules/body-parser/lib/types/json.js:88:17)
at /Users/STarLiu/WebstormProjects/Realtime/node_modules/body-parser/lib/read.js:108:18
at invokeCallback (/Users/STarLiu/WebstormProjects/Realtime/node_modules/raw-body/index.js:262:16)
at done (/Users/STarLiu/WebstormProjects/Realtime/node_modules/raw-body/index.js:251:7)
at IncomingMessage.onEnd (/Users/STarLiu/WebstormProjects/Realtime/node_modules/raw-body/index.js:308:7)
at emitNone (events.js:80:13)
at IncomingMessage.emit (events.js:179:7)
at endReadableNT (_stream_readable.js:913:12)
at _combinedTickCallback (internal/process/next_tick.js:74:11)
问题所在:
检查了一轮, header是对的,数据内容也是对的, Google搜出来的答案也不能解决问题。最后发现问题出在对于 "string" 冒号的转换上。按照平时我们写js时的写法,{username: 'wusp'}, {'username' : 'wusp'} 这样的写法是OK的,能被正确转换为json数据。因此我在客户端post上来的数据中也采用了这样的写法,事实证明这是行不同的,对于“{'username' : 'wusp'}”这样的字符串,通过JSON.parse(str)是不能正确转换的。
客户端post的json字符串错误写法1:
"{username: "+ username +", password: "+ password +"}"
客户端post的json字符串错误写法2:
"{'username': '"+ username +"', 'password': '"+ password +"'}"
那么正确的写法是:
"{\"username\":\""+ username +"\",\"password\":\""+ password +"\"}"
总结:
So.... 永远记住从客户端post json数据到服务器时,在直接使用字符串组装json数据的时候,要使用正确的"转义符来包裹key和value;或者使用已经封装好的用于组装json数据字符串的API来组装json字符串,避免服务器端出现上述的错误哦。