为什么`fetch`将我的JSON字符串转换为查询字符串?副作用?

时间:2017-07-19 12:07:10

标签: javascript node.js fetch

整个下午我都经历过这个,请帮我调试。

客户端:

fetch('/admin/edit/tags', {
    method: 'post',
    credentials: 'same-origin',
    headers: {
        'content-type': 'application/json',
        'accept': 'application/json'
    },
    body: form.getFormData('json')
})...

console.log(form.getFormData('json'));返回{"id":"11","tag":"tag12","submit":"Update"}

服务器端(Node.js):

请求处理代码:

function (req, res) {
    var bufferBody = [];
    req.on('error', err => {
      return res.status(400).send('request error.');
    }).on('data', chunk => {
      bufferBody.push(chunk);
    }).on('end', () => {
      res.on('error', err => {
        return res.status(400).send('response error.');
      });
      req.bufferBody = bufferBody;
      req.stringBody = Buffer.concat(bufferBody).toString();
      //req.json = JSON.parse(req.stringBody);
      req.body = qs.parse(req.stringBody);
    })
}

路线:

{
    method: 'POST',
    path: '/admin/edit/tags',
    handle: PC(function*(req, res) {
        var data = req.body;
        console.log(data);
        console.log(req.stringBody);
    })
}

这是缓冲区字符串:theBuffer.toString() %7B%22id%22%3A%2211%22%2C%22tag%22%3A%22tag12%22%2C%22submit%22%3A%22Update%22%7D=

这是查询字符串:qs.parse(theBufferString) { '{"id":"11","tag":"tag12","submit":"Update"}': '' }

我已检查过每个地方,标题是否正确。可能导致jsonString变为queryString的原因是什么?

我知道我可以将jsObject转换为queryString,但我真的很想使用jsonString。

1 个答案:

答案 0 :(得分:0)

我弄明白了这个问题。它在服务器端。

我编写了自己的请求客户端,在客户端中,我将req.body转为query string。因为在我刚刚关注示例之前:https://nodejs.org/api/http.html(滚动到结尾)在Node.js文档中。所以我添加了req.headers['content-type']检查,如果josn,请使用JSON.stringify,否则qs.stringify

if (options.body) {//solve socket hangup problem
    if (isJSON()) {
    // TODO add more content-type, not just json
    //e.g for forms: application/x-www-form-urlencoded
        options.body = JSON.stringify(options.body);
    }   else {
        options.body = qs.stringify(options.body);
    }
    options.headers['content-length'] = Buffer.byteLength(options.body);
}