通过 Ajax 请求发送后无法解析 JSON

Can't parse JSON after sending it via Ajax request

客户端

JSON.stringy 应用到 object 后,它会像这样发送到 node-server(如 POST-request):

{"id":"topFolder","parentPath":null,"name":"newProject","is":"root","children":[]}

我正在通过 Polymer 的 iron-ajax-element 在客户端上发送请求: <iron-ajax id="ajaxSave" method="POST" url="/save" handle-as="json" on-response="doit" </iron-ajax>

用这个函数发送:

save: function() {
  var v = JSON.stringify(this.data);
  this.$.ajaxSave.body = v;
  this.$.ajaxSave.generateRequest();
}

服务器端

然后我尝试 JSON.parse Koa-server 上的请求 body(使用 Koa-Body 作为 body 解析器):

router.post('/save', body, function*(){
  let data = JSON.parse(this.request.body);
  this.body = "all ok";
})

我得到一个 SyntaxError: Unexpected token o,原始 body 看起来像这样:

{ '{"id":"topFolder","parentPath":null,"name":"new Project","is":"root","children":': [ '' ] }

为什么收到的 body 看起来不一样,我该如何解决?

编辑:这是完整的 curl-command 请求:

curl 'http://localhost:3000/save' -H 'Authorization: Basic YWRtaW46ZXZvbGE=' -H 'Origin: http://localhost:3000' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36' -H 'content-type: application/x-www-form-urlencoded' -H 'accept: application/json' -H 'Referer: http://localhost:3000/' -H 'Cookie: ajs_anonymous_id=%22e43155da-6541-45de-af9f-046ff5ac7b3c%22; currentUserId=34; -H 'Connection: keep-alive' --data '{"id":"topFolder","open":false,"parentPath":null,"name":"new Project","children":[]}' --compressed

您的对象已经是一个对象。

JSON.parse()用于将包含JSON符号的字符串转换为Javascript对象。

例如,尝试:this.request.body["id"] 获取属性之一。

通常 body 不是字符串,因此请尝试将其显式转换为字符串。

body.toString()

如果没有帮助... 在某些传输库中,您必须在调用 body.read() 之前读取正文。读取操作可以是异步的..

用 q-io 看起来像

request(someURL)
.then( function(res) {
  return res.body.read() 
})
.then( function (body){
  obj = JSON.parse(body.toString()
})

问题是 content-type 设置为 application/x-www-form-urlencoded。 必须是 application/json