2017-07-19 14 views
0

私はこの午後中ずっと行ってきました、デバッグを手伝ってください。`fetch`がJSON文字列をクエリ文字列に変換したのはなぜですか?副作用?

クライアント側:

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を使いたいと思っています。

+0

いいえ、その投稿はjsfiddleに固有です。私は時間前にそれを見ました。 – alexcres

+0

@AlexBlexその投稿はjsfiddleに固有で、 'json string'の代わりに' query string'を使うことをお勧めします。しかし 'fetch'は' json string'で動作するとは思いませんか? – alexcres

+0

これは、fetchとformdataを使ってPOSTする方法の非常に有効な例です。 –

答えて

0

私は問題を把握しました。サーバー側にあります。

私は自分のリクエストクライアントを書いており、クライアントではreq.bodyquery stringになっています。私が前に例を追いかける前に、Node.jsドキュメントのhttps://nodejs.org/api/http.html(最後までスクロールしてください)のためです。そこでチェックを追加しました。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); 
} 
関連する問題