Progateを参考にNode.js
、Express
、ejs
でアプリを作成していたのだが、
POST処理のreq.body
でFromの値を取得することができない。
app.post('/edit/:id',(req,res) => {
connection.query(
'UPDATE users SET name = $1 WHERE id = $2',
[req.body.nname, req.params.id], //ここでキャッチしたい〜
(error,result) => {
res.redirect('/top');
}
);
});
なんでや〜
いろいろ調べた結果、2つの原因が判明したので、メモ( ・∇・)
#原因1:body-parser
Expressでクライアントからデータを取得する場合、body-parser
をインストールしてreq.body
経由でデータを取得する必要があった。
なので以下の処理を実施
####1.body-parser のインストール
$ npm install body-parser --save
####2.app.jsで使用できるように記述
const bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({
extended: true
}));
##だがしかし!!!!!!!!!!
Express __ver.4.16.0以降は、Body-Parserの機能が標準で搭載__されているみたい!
そのため、わざわざbody-parser
のインストールしなくてもよく、代わりにexpress.json()
を使用すればいいみたい。
####1.express.json()を使用できるように、app.jsを編集
//const bodyParser = require("body-parser");
//app.use(bodyParser.urlencoded({
// extended: true
//}));
//↓に変更
app.use(express.json());
app.use(express.urlencoded({
extended: true
}));
#原因2:httpヘッダーのcontent-type
httpヘッダーのcontent-typeがapplication/x-www-form-urlencoded
でないといけないとのこと。
自分はファイルの保存がしたくて、multipart/form-data
にしていたため、req.body
が取得できなかったみたい。
Formでのcontent-typenの指定は、enctype=""
で指定します。
ちなみに、何も指定しない場合は、デフォルトでapplication/x-www-form-urlencoded
となっているようです。
#おわりに
以上の2点を気をつけることで、無事にreq.body
を取得することができるようになりました。
これ解決するまで2日くらいがんばりました。
終わってみれば、「こんなことかー」て思いますが、ここまでたどり着くのは大変でしたね。
ほんと独学は疲れる。