2017-01-21 12 views
3

NodeJSのルートでAJAXにfetch()を使用するフォームがあります。 AJAX POSTがルートにヒットすると、req.bodyは空のオブジェクト{}を表示します。Express JSルートでformDataでPOSTを取得すると、空白になる

は、ここでは、コードです:app.js

app.use(bodyParser.json())で

//;

app.use(bodyParser.urlencoded({extended:true}))); form.jsで

//

form.getElementById('form__option').addEventListener('submit', e => { 
    e.preventDefault() 
    const form = $('form')[0] 
    fetch('/polls/create', { 
     method: 'POST', 
     body: new FormData(form) 
    }) 
}) 

// appRoute.jsで

exports.createPost = (req, res, next) => { 
    console.log('req body', req.body) 
    res.send('NOT IMPLEMENTED: pollsController createPost'); 
} 
+1

あなたのルート定義の前にapp.use(...)を入れましたか? – cshion

+0

はい、両方のapp.useがapp.use(...、router)の前に実行されます – bresson

+1

コードが正しく表示されます。ブラウザからリクエストの本文を確認して、正しいことを確認する必要があります(Chrome DevToolの[ネットワーク]タブを使用できます)。次に、ルータ(ミドルウェア)の最初の部分をapp.useに追加し、 'req.body'を確認してください –

答えて

2

ここでの問題はFormDatamultipart/form-data、Expressをであるとコンテンツ・タイプを設定するということですbody-parserは分かりません。

注コメントhere

[ボディパーサー]それらの複雑かつ一般的に大規模な自然にマルチパートのボディを、処理しません。マルチパート本体については、以下のモジュールに興味があります:busboyとconnect-busboy;多パーティーとコネクト・マルチパーティー。恐るべき;ムルター。

つまり、FormDataが送信するマルチパート本体を処理するために別のモジュールを使用する必要があります。 formidableをお勧めします。この場合、サーバーコードは次のようになります。

const formidable = require('formidable') 

exports.createPost = (req, res, next) => { 
    var form = new formidable.IncomingForm(); 
    form.parse(req, (err, fields, files) => { 
     console.log(fields) 
     res.send('NOT IMPLEMENTED: pollsController createPost'); 
    } 
} 
関連する問題