2017-08-20 6 views
1

私はExpressbody-parserミドルウェアを使用して着信要求を処理しています。フロントエンドでは、私はちょうど隠し入力及び(パグで書かれた)提出ボタンの形があります。バックエンドでExpress.js + body-parser:POSTリクエストから空のreq.body

form(notes="saveNotesForm" action=`/lessons/${lesson._id}/notes` method="POST" enctype="application/x-www-form-urlencoded") 
       input(type="hidden" id="hiddenNotes" name="hiddenNotes" alt="Notes Copy" value="test").notesHidden 
       input(type="submit" name="saveNotes" alt="Save Notes" value="Save") 

を、私はボディパーサーを使用してExpressのアプリを持っている:

const bodyParser = require('body-parser'); 
// ... 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: true })); 

、着信要求の処理ルート:

router.post('/lessons/:lessonID/notes', lessonController.updateNotes); 

// ... and in lessonController: 

exports.updateNotes = async (req, res) => { 
    console.log('updateNotes request received'); 
    console.log(req.body); 
    res.status(200).json({ status: 'success' }); 
} 

を私はupdateNotesreq.bodyを使用しようとすると、体が空のオブジェクトであるが、少なくとも性質を持っている必要がありhiddenNotesの値は"test"です。ご不明な点がある場合は、コメントをお寄せください。これは愚かな間違いだった

は[UPDATED]、私はこのフォームが送信されますときに個別のイベントハンドラを書いていた忘れてしまった - それはちょうど私が私のコードのすべてを行く前に、私はSOに投稿しました:)イベントハンドラはaxiosを使用し、次のようになります。axiosとpost Sを作るとき

const SaveNotesButton = $('form.saveNotes'); 
SaveNotesButton.on('submit', ajaxSaveNotes); 

function ajaxSaveNotes(e) { 
    e.preventDefault(); 
    axios 
    .post(this.action) 
    .then(res => { 
     console.log(res.data); 
    }) 
    .catch(console.error); 
} 

は残念ながら、あなたはこのようなオブジェクト内のデータを含める必要がある、またはそうでなければには含まれませんリクエスト:

const SaveNotesButton = $('form.saveNotes'); 
SaveNotesButton.on('submit', ajaxSaveNotes); 

function ajaxSaveNotes(e) { 
    e.preventDefault(); 
    axios 
    .post(this.action, { notes: this.children.hiddenNotes.value }) // Data added here 
    .then(res => { 
     console.log(res.data); 
    }) 
    .catch(console.error); 
} 
+0

'bodyParser.urlencoded'を' bodyParser.json'の前に呼び出すように変更しようとしましたか?違いがあるのか​​どうか分かりませんが、私は自分のミドルウェアを書いて生のボディ要求をキャプチャして何も失うことはなく、 'bodyPaser.json'の後に' req.on( 'end') 'イベントが私はデータを記録できません。それ以前に私のミドルウェアを置くことで(そして他のいくつかの変更)、問題を解決することができました。 – OwChallie

答えて

0

郵便番号または類似のものを使用してエンドポイントを照会する必要がありますか?

+0

郵便配達でリクエストを再作成しようとしましたが、本文にはまだデータが表示されませんでした。 –

0

あなたのreq.bodyが定義されていない理由について1つの考えられる説明があります。あなたのapp.use(bodyParser.json())app.use(bodyParser.url...は、app.use('***', router)行の前に書かれていますか?ミドルウェアがapp.useの順に呼び出されるため、あなたのルータミドルウェアの後に本体パーサミドルウェアを置くと、基本的に呼び出されません。したがって、すべてのルータロジックの前にbodyParserを置く必要があります。その後、BodyParserミドルウェアは、すべてのルーターレベルのミドルウェアを含む他のすべてのミドルウェア(後でreq.bodyが入力されます)を呼び出します。

希望すると助かります!

+0

こんにちはMustansir!ええ、アプリケーションにルートが含まれる前に、数行前にbodyParserを使用しています。 –

+0

content-typeをapplication/jsonに変更しようとしたことがありますか? –

+0

私はenctypeを変更しようとはしていませんでしたが、この記事に含まれているコードとは無関係です。[非常に明白な間違いを犯しました](https://media.giphy.com/media/eY3PhUq1mfyWA/giphy.gif)。 OPのアップデートを一瞬で一目見てみましょう! –

0

わからない、あなたのルートを定義しているが、私はポストルートがどのように見えることを期待するか、次の

const express = require('express'); 
const app = express(); 
app.use(bodyParser.urlencoded({extended: true})); 
app.use(bodyParser.json()); 

app.post('/lessons/:lessonID/notes', (req, res) => { 
    // now pass the req object to your function 
    lessonController.updateNotes(req); 
}); 

あなたはreq.bodyにアクセスできるようにあなたの関数へのreqオブジェクトを渡す必要があります...

+0

エクスプレスアプリのルートは、 'app.post'と同じ行にあるのではなく別のファイルに分かれています。lessonController.updateNotes関数はreqとresオブジェクトを受け取ります。 –

+0

[私は非常に明白な間違いを犯しました](https://media.giphy.com/media/eY3PhUq1mfyWA/giphy.gif)、この記事に含まれているコードとは無関係です。 OPへの私の更新を一目で見てください! –

+0

あなたはそれを並べ替えてうれしい! – TheTechy

関連する問題