req.bodyが空の投稿


256

突然、これは私のすべてのプロジェクトに起こっています。

expressとbody-parserを使用してnodejsで投稿を作成すると、常にreq.body空のオブジェクトになります。

var express    = require('express')
var bodyParser = require('body-parser')

var app = express()

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded())

// parse application/json
app.use(bodyParser.json())

app.listen(2000);

app.post("/", function (req, res) {
  console.log(req.body) // populated!
  res.send(200, req.body);
});

ajaxとpostmanを介して、それは常に空です。

しかしカールを介して

$ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/

意図したとおりに機能します。

Content-type : application/json前者で手動設定を試しましたが、その後常に得ます400 bad request

これは私を夢中にさせてきました。

body-parserで何かが更新されたのだと思いましたが、私はダウングレードし、それは助けにはなりませんでした。

助けてくれてありがとう、ありがとう。


16
ではContent-Type、郵便配達員に明示的に設定してみましたか?そうでない場合、私は以前に郵便配達員がを送信しないという問題を抱えていたので、あなたはそれを試すかもしれませんContent-Type
mscdex 2014

はい、そうしました。それは私が400を受け取ったときです:無効なjson
ジョセフデイリー14

@mscdex-おかげで私は郵便配達員にcontent-tupeを設定せず、夢中になりました:)
Ali

APIからファイルを送信/アップロードするためにフォームデータを使用する必要があるため、ここに来る人々のために。フォームデータを処理するために何かが必要です。npmjs.com / package / multerはかなり人気のあるパッケージです。
bhaskar

とにかく、郵便配達員は整数と浮動小数点値をうまく処理しません。あなたは、整数または浮動小数点値を持っている場合は、二重引用符のすべてを、キーと値の両方を確保
anabeto93

回答:


272

コンテンツタイプに使用できる3つのオプションのPostmanで、「X-www-form-urlencoded」を選択すると、機能するはずです。

また、エラーメッセージを取り除くために置き換えます:

app.use(bodyParser.urlencoded())

と:

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

https://github.com/expressjs/body-parserを参照してください

「body-parser」ミドルウェアは、JSONとURLエンコードされたデータのみを処理し、マルチパートは処理しません


それは郵便配達員のために働きました、私は何も変更しなかったので、なぜそれがajaxでうまくいくのかわかりません。
ジョセフデイリー2014

何らかの理由で、Angularを介したhttp投稿はURLエンコードする必要はありませんでしたが、ajax呼び出しは必要でした。誰もが理由を知っていますか?
youngrrrr 2016年

これは私にとってはうまくいきましたが、なぜ生のエンコードでうまくいかなかったのですか?
Daniel Kobe

9
body-parserにexpress.jsがapp.use(express.json());
組み込まれている

どうもありがとうございます!これは長い間回答されてきましたが、それでもなお関連があります。
Spray'n'Pray

218

Postmanを使用して、未加工のJSONデータペイロードでHTTP postアクションをテストするには、rawオプションを選択し、次のヘッダーパラメーターを設定します。

Content-Type: application/json

また、JSONペイロードでキー/値として使用されている文字列を二重引用符で囲むようにしてください。

body-parserパッケージには、うまく複数行生のJSONペイロードを解析します。

{
    "foo": "bar"
}

以下の設定でPostman v0.8.4.13拡張機能(body-parserv1.12.2およびexpressv4.12.3)を使用してChrome v37およびv41でテストされています。

var express = require('express');
var app = express();
var bodyParser = require('body-parser');

// configure the app to use bodyParser()
app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(bodyParser.json());

// ... Your routes and methods here

Postman Raw jsonペイロード


ああ、どうやって私は適切にフォーマットされたJSONオブジェクトではなくJSオブジェクトリテラルを貼り付けたのを逃した...:-S ...ありがとう
Wes Johnson

キー/値として使用される文字列を二重引用符で囲みます...見落としがちですが、それ以外の場合は完全な取引ブレーカーです!ありがとうございました。
loxyboi

スクリーンショットの使い方が良い。
Xan-Kun Clark-Davis

form-dataPostmanでデータをポストするために使用するとき、私は常に{}req.bodyでを取得します。Content-Typeオプションを設定する必要があり ますか?
mingchau

56

私は本当におかしな間違いを犯しname、htmlファイルで入力の属性を定義するのを忘れていました。

だから代わりに

<input type="password" class="form-control" id="password">

これがあります。

<input type="password" class="form-control" id="password" name="password">

これrequest.bodyで次のように入力されます:{ password: 'hhiiii' }


1
バム。それが問題でした。ありがとう!
Matt West

それはまさに私の問題でした。名前の値のないフォーム入力は、それを理解しようと何時間も費やしました。ありがとう。
karensantana

37

コンテンツタイプで送信すると機能することがわかりました

「application / json」

サーバー側と組み合わせて

app.use(bodyParser.json());

今、私は送ることができます

var data = {name:"John"}
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("POST", theUrl, false); // false for synchronous request
xmlHttp.setRequestHeader("Content-type", "application/json");
xmlHttp.send(data);

結果はrequest.body.nameサーバーで利用できます。


賛成票をありがとう。とにかく正しいコンテンツタイプを送信する必要があるため、これは最も簡単な解決策ではありませんが、本当に最もクリーンだと思います。おもう。
Xan-Kun Clark-Davis

これが答えです!
ジェル

私の場合、それをxmlHttp.send(JSON.stringify(data));
end64

18

今日この問題に遭遇しましたが、修正されたのはPostmanのcontent-typeヘッダー削除することでした!非常に奇妙な。誰かを助けるためにここに追加します。

私はここでBeerLockerチュートリアルに従っていました:http ://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/


2
同じ問題がありました。ヘッダーを「オフ」(およびグレー表示)にするだけでは不十分で、完全に削除する必要がありました。「</>」ソースボタンは、Content-Typeがチェックされていない状態でそのヘッダーを送信していないことを示していますが、完全に削除する必要がありました。
theRemix 2015

postman chrome拡張機能のデフォルトヘッダーを削除する方法がわかりません...アプリを使用していますか?
WestleyArgentum 2016年

ああ、私はアプリをインストールし、それは拡張機能よりもはるかによく機能します。騒音でごめんなさい。
WestleyArgentum 2016年

12

body-parserミドルウェアがリクエストのタイプ(json、urlencoded)に適切に設定されているかどうかを確認する必要があります。

セットしたら

app.use(bodyParser.json());

郵便配達では、生のデータを送信する必要があります。

https://i.stack.imgur.com/k9IdQ.png postmanスクリーンショット

セットしたら

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

次に、「x-www-form-urlencoded」オプションを選択する必要があります。


両方持っているのはどうですか?(bodyParser.urlencodedおよびbodyParser.json())...どちらをpostmanで使用できますか?
TommyLeong

9

私の問題は、最初にルートを作成していたことでした

// ...
router.get('/post/data', myController.postHandler);
// ...

ルートにミドルウェアを登録する

app.use(bodyParser.json());
//etc

アプリの構造とサンプルからプロジェクトをコピーして貼り付けるため。

ルートの前にミドルウェアを登録するための順序を修正したら、すべてが機能しました。


おかげでフィアット、正しい順序で、それは最後に私のために働いた生タブ使用して
アレックス・

4

node.jsを初めてWebアプリで学習し始めたときでも、フォームでこれらのすべてを適切に実行していましたが、要求後に値を受け取ることができませんでした。長いデバッグの後、私はenctype="multipart/form-data"値を取得できなかったために提供したフォームでそれを知った。私はそれを単に削除し、それは私のために働いた。


はい、これは、フォーム本体を得るために働いていたが、その後、私の形で別の問題が発生する-これが必要なため、基本的にファイルをアップロードすることができませんでしたenctype="multipart/form-data"
tsando

ところで、上記のコメントに追加するだけで、私はこれmulterうまく
tsando

3

encTypeを使用しない場合(デフォルトはapplication/x-www-form-urlencoded)、テキスト入力フィールドは取得されますが、ファイルは取得されません。

テキスト入力とファイルを投稿するフォームがある場合は、multipart/form-dataエンコーディングタイプを使用し、それに加えてmulterミドルウェアを使用します。Multerはリクエストオブジェクトを解析し、準備req.fileを整えますreq.body。他のすべての入力フィールドはから利用できます。


1
ありがとう- multer本当に私の問題の解決策でした。これを回答の一部として使用する方法の例を追加できればよいでしょう
tsando

2

私にも同様の問題が発生し、コールバックパラメータの順序を単純に混ぜました。コールバック関数を正しい順序で設定していることを確認してください。少なくとも同じ問題を抱えている人にとっては。

router.post('/', function(req, res){});

2

["key": "type"、 "value": "json"]&["key": "Content-Type"、 "value": "application / x-www-form-urlencoded"]が郵便配達員のリクエストヘッダー


2

multer上記で提案したように私はこれを解決しましたが、彼らはこれを行う方法についての完全な実用的な例を与えるのを逃しました。基本的に、これはを含むフォームグループがある場合に発生しますenctype="multipart/form-data"。ここに私が持っていたフォームのHTMLがあります:

<form action="/stats" enctype="multipart/form-data" method="post">
  <div class="form-group">
    <input type="file" class="form-control-file" name="uploaded_file">
    <input type="text" class="form-control" placeholder="Number of speakers" name="nspeakers">
    <input type="submit" value="Get me the stats!" class="btn btn-default">            
  </div>
</form>

そしてmulter、これがExpress.jsとでこのフォームの値と名前を取得するために使用する方法ですnode.js

var multer  = require('multer')
var upload = multer({ dest: './public/data/uploads/' })
app.post('/stats', upload.single('uploaded_file'), function (req, res) {
   // req.file is the name of your file in the form above, here 'uploaded_file'
   // req.body will hold the text fields, if there were any 
   console.log(req.file, req.body)
});

1

私は数分前に同じ問題を抱えていました。上記の回答で可能な限りのことを試しましたが、どれもうまくいきました。

私がした唯一のことは、Node JSのバージョンをアップグレードすることでした。アップグレードが何かに影響を与える可能性があることを知りませんでしたが、実際に影響しました。

Node JSバージョン10.15.0(最新バージョン)をインストールし8.11.3ました。に戻り、すべてが動作しています。たぶんbody-parserモジュールはこれを修正する必要があります。


1

入力に名前がありませんでした...リクエストは空でした...終了して、コーディングを続けることができてうれしいです。みんな、ありがとう!

Jason Kimが使用した回答:

だから代わりに

<input type="password" class="form-control" id="password">

私はこれを持っています

<input type="password" class="form-control" id="password" name="password">

1

JSON.stringify(data)以下のようにAJAXを介して送信している間は行うべきではありません。

これは正しいコードではありません:

function callAjax(url, data) {
    $.ajax({
        url: url,
        type: "POST",
        data: JSON.stringify(data),
        success: function(d) {
            alert("successs "+ JSON.stringify(d));
        }
    });
}   

正しいコードは次のとおりです。

function callAjax(url, data) {
    $.ajax({
        url: url,
        type: "POST",
        data: data,
        success: function(d) {
            alert("successs "+ JSON.stringify(d));
        }
    });
}

ここで注意すべき重要な点は、タイプでは必ず「POST」を大文字にすることです。「post」を使用するだけでreq.bodyが空白になる例を見てきました。
Matt C.

1

郵便配達員と一緒にやっている場合は、APIをリクエストするときにこれらのことを確認してください

ここに画像の説明を入力してください


0

Expressの代わりにRestifyを使用していて、同じ問題に遭遇しました。解決策は次のとおりです。

server.use(restify.bodyParser());


0

app.use(bodyParser.urlencoded());コードを次のように変更します

app.use(bodyParser.urlencoded({extended : false}));

そして郵便配達では、ヘッダーのContent-Type値をからapplication/x-www-form-urlencodedに変更します application/json

Ta :-)


0

すばらしい回答をありがとうございました!かなりの時間をかけて解決策を探しましたが、私の側では基本的な間違いを犯していました:bodyParser.json()関数内から呼び出していました:

app.use(['/password'], async (req, res, next) => {
  bodyParser.json()
  /.../
  next()
})

私はする必要がありapp.use(['/password'], bodyParser.json())、それはうまくいった...


0

郵便配達員では、受け入れられた回答に従った後でも、空のリクエスト本文を受け取っていました。問題は、と呼ばれるヘッダーを渡していないことが判明

Content-Length : <calculated when request is sent>

このヘッダーは、デフォルトで(他の5つとともに)存在していましたが、無効にしています。これを有効にすると、リクエストの本文が届きます。


0

私の問題は、最初require("./routes/routes")(app); にルートを作成する ことでした。以前にコードの最後に移動したため、app.listen うまくいき ました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.