Express.js req.body undefined


291

これは私のExpressサーバーの構成として持っています

app.use(app.router); 
app.use(express.cookieParser());
app.use(express.session({ secret: "keyboard cat" }));
app.set('view engine', 'ejs');
app.set("view options", { layout: true });
//Handles post requests
app.use(express.bodyParser());
//Handles put requests
app.use(express.methodOverride());

しかし、それでもreq.body.something私が私のルートで尋ねると、それを指摘するいくつかのエラーが出body is undefinedます。を使用するルートの例を次に示しますreq.body

app.post('/admin', function(req, res){
    console.log(req.body.name);
});

この問題は不足が原因であると読みましたが、app.use(express.bodyParser());ご覧のとおり、ルートの前に呼び出します。

どんな手掛かり?

回答:


296

ルートを定義する前に、すべての構成を定義する必要があります。その場合は、引き続き使用できますexpress.bodyParser()

次に例を示します。

var express = require('express'),
    app     = express(),
    port    = parseInt(process.env.PORT, 10) || 8080;

app.configure(function(){
  app.use(express.bodyParser());
  app.use(app.router);
});

app.listen(port);

app.post("/someRoute", function(req, res) {
  console.log(req.body);
  res.send({ status: 'SUCCESS' });
});

9
これでうまくいきました。注:残念ながら、世の中のいくつかのチュートリアルでは、(私のような)人がapp.configure()の前にルートを配置しています。私の場合、これはapp.get / postなどの形式で、それらを含むrequire()でした。
ベンドマン2013

1
どうもありがとう、私はこの問題を一日中トラブルシューティングしてきました。
jfplataroti 2013

11
Express 4以降、app.use(app.router)は削除されました。ドキュメントを参照してくださいgithub.com/visionmedia/express/wiki/New-features-in-4.x
Jonathan Ong

15
Express 4以降、bodyParserなどのミドルウェアはExpressにバンドルされなくなったため、個別にインストールする必要があります。詳細については、github.com / senchalabs / connect#middlewareをご覧ください
andrea.rinaldi 2014

2
ありがとう。この回答は2年以上前のものであり、問​​題を抱えている人々を支援し続けます:)
Lorenzo Marcon

275

Expressの最新バージョン(4.x)では、ミドルウェアがコアフレームワークからバンドルされていません。ボディパーサーが必要な場合は、個別にインストールする必要があります

npm install body-parser --save

あなたのコードでこれを行います

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

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))

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

2
私は最近4.xを表現するように更新しました。最初にreq.bodyをログに記録しようとしたときに、未定義と表示されていました。body-parserをインストールして使用すると、期待されるreq.body値が得られます。:)
Alok Adhao

私のPOSTリクエストがjson-serverで機能しなかった理由を解明しようとしたときに、これが便利であることがわかりました。
freethebees 2016年

私の日、特に 'app.use(bodyParser.json())'の部分を保存しました。ありがとう兄貴 !:D
neaGaze 2016

これはExpress 4で完全に機能するため、受け入れられる答えになるはずです。ありがとうございます!
結合

2
app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()) 助かりました !!
Pramesh Bajracharya 2017年

71

いいえ。app.use(express.bodyParser())前に使用する必要がありますapp.use(app.router)。実際にapp.use(app.router)は、あなたが呼び出す最後のものでなければなりません。


でも、移動app.use(app.router)の下で.use問題を解決していない:(呼び出し。
Masiar

少し苦労した後、app.use(require('connect').bodyParser());代わりにを使用して解決しましたapp.use(express.bodyParser());
Masiar

はい、使用しても答えは真var router=express.Router()です。
Istiaque Ahmed 2015

1
わずかな補遺、あなたはまだapp.router後にエラー処理ミドルウェアを呼び出す必要があります
クラフト

BLESS THIS COMMENT
Ke Ke

40

最初に、次の呼び出しによって「body-parser」という名前のnpmモジュールがインストールされていることを確認します

npm install body-parser --save

ルートを呼び出す前に、次の行が含まれていることを確認してください

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

app.use(bodyParser.json());

express.jsonを使用している場合、ボディパーサーをインポートする理由は何ですか。
SanSolo 2018

38

Express 4には、ボディパーサーが組み込まれています。別のボディパーサーをインストールする必要はありません。だから以下はうまくいくでしょう:

export const app = express();
app.use(express.json());

37

リクエストヘッダーのContent-Typeは、特にcurlまたはその他のツールからデータを投稿する場合に非常に重要です。

application / x-www-form-urlencoded、application / jsonなどを使用していることを確認してください。投稿データによって異なります。このフィールドを空のままにすると、Expressが混乱します。


12
+1これは私にとって問題でした。Postman for Chromeを使用してREST組み込みのJSON APIをテストしていましたが、Expressが受け取ったオブジェクトは毎回空でした。既定でPostmanは、raw> jsonを選択しても、 'Content-Type:application / json'ヘッダーを自動的に追加しないことがわかりました。
ジョーダン

@ジョーダン+1これを指摘してくれてありがとう。実際、ヘッダーを確認したところ、「json」を選択したにもかかわらず、「text / plain」に設定されていることがわかります。
エンジニア

うわ... 7年後、これは私をトリップ何...まだです
Shaun314

33

すでに1つのコメントの下で投稿されたように、私はそれを使って解決しました

app.use(require('connect').bodyParser());

の代わりに

app.use(express.bodyParser());

シンプルexpress.bodyParser()が機能しない理由はまだわかりません...


1
@Masiarこれは私のために働いていません。私はexpressjs 4を使用しています&このようなエラーが発生します。エラー:モジュール 'connect'が見つかりません
Jeyarathnem Jeyachanthuru

1
@JeyTheva鉱山はかなり古いソリューションであるため、物事はその間に変更された可能性があります。connect経由npm install connectでモジュールをインストールして、再試行することをお勧めします。これは、エラーの出力を読むことで考えられる唯一のことです。
Masiar 2014年

4
この問題を解決するための最新のドキュメントは次のとおりです。npmjs.com / package / body-parser この問題「post express 4」が発生した他の人にとって、私に有効だったのはContent-Typeヘッダーをに設定することapplication/jsonでした。
Grant Eagon

3
この問題を解決するための最新のドキュメントは次のとおりです。npmjs.com / package/ body-parser body-parserをインストールした後も動作しませんでした。うまくいったのは、リクエストを行っているときにContent-Typeヘッダーを設定するapplication/jsonことでした。
Grant Eagon、2016年

1
application/jsontext/json@GrantEagonにより示唆されるように、要求作品インチ
2016

21
// Require body-parser (to receive post data from clients)

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

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

// parse application/json

app.use(bodyParser.json())


12

body-parserはExpressに同梱されなくなったようです。別途インストールが必要な場合があります。

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

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))

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

// parse application/vnd.api+json as json
app.use(bodyParser.json({ type: 'application/vnd.api+json' }))
app.use(function (req, res, next) {
console.log(req.body) // populated!

詳細と例については、gitページhttps://github.com/expressjs/body-parserを参照してください。


1
これは新しいExpress 4.xフォーマットのようで、私にとってはうまくいきました。他の回答で述べられているexpress.bodyParser()は、4.xでは機能しません。
DustinB 2014年

10

誰かが同じ問題に遭遇した場合に備えて。私はのようなURLプレフィックスを使用しています

http://example.com/api/

ルーターで設定した

app.use('/api', router); 

それから私は次のことをしました

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

私の問題を修正したのは、上記のbodyparser構成を配置することでした app.use('/api', router);

最後の

// setup bodyparser
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: true }));

//this is a fix for the prefix of example.com/api/ so we dont need to code the prefix in every route
    app.use('/api', router); 

9

express.bodyParser()は、解析するコンテンツのタイプを通知する必要があります。したがって、POSTリクエストを実行するときに、「Content-Type」ヘッダーが含まれていることを確認する必要があります。そうしないと、bodyParserがPOSTリクエストの本文をどう処理するかを認識できない場合があります。

本文にJSONオブジェクトを含むPOSTリクエストをcurlを使用して実行している場合は、次のようになります。

curl -X POST -H "Content-Type: application/json" -d @your_json_file http://localhost:xxxx/someRoute

別の方法を使用する場合は、適切な規則を使用してヘッダーフィールドを設定してください。


8

app.use(bodyparser.json());を使用します。ルーティング前。//。app.use( "/ api"、ルート);



7

JSONパーサーがないため、ほとんどの場合req.bodyは未定義です

const express = require('express');
app.use(express.json());

body-parserで欠落している可能性があります

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

そして、時々それはクロスの起源のために未定義ですので、それらを追加してください

const cors = require('cors');
app.use(cors())

5

これは今日私に起こりました。上記の解決策はどれも私にはうまくいきません。しかし、少しグーグルすることでこの問題を解決することができました。私はwechatサードパーティサーバーをコーディングしています。

node.jsアプリケーションがRESTクライアントからのリクエストなどのストリーミングPOSTデータを読み取る必要がある場合、状況は少し複雑になります。この場合、リクエストのプロパティ「読み取り可能」はtrueに設定され、すべてのコンテンツを収集するためにPOSTデータをチャンクで読み取る必要があります。

http://www.primaryobjects.com/CMS/Article144


この投稿では、RESTクライアントのリクエストとは異なり、HTMLフォームの送信について言及しています。両方ともhttpリクエストではありませんか?したがって、POSTはストリーミングが必要な唯一のケースですか?
j10

5

多くの時間を無駄にしました:

クライアント要求のContent-Typeに応じて
サーバーは以下のいずれかのapp.use()を持つ必要があります

app.use(bodyParser.text({ type: 'text/html' }))
app.use(bodyParser.text({ type: 'text/xml' }))
app.use(bodyParser.raw({ type: 'application/vnd.custom-type' }))
app.use(bodyParser.json({ type: 'application/*+json' }))

ソース:https : //www.npmjs.com/package/body-parser#bodyparsertextoptions

例:

私にとって、クライアント側では、ヘッダーの下にありました:

Content-Type: "text/xml"

だから、サーバー側では、私は使用しました:

app.use(bodyParser.text({type: 'text/xml'}));

その後、req.bodyは正常に動作しました。



4

機能させるには、app.use(express.bodyParser())の後にapp.use(app.router)を実行する必要があります。

app.use(express.bodyParser())
   .use(express.methodOverride())
   .use(app.router);

1
コメントとコードスニペットが矛盾しています。まずapp.useapp.router以前に使用する必要があると言いますexpress.bodyParserが、コードはそれがAFTERであることを明確に示しています。どっち?
Levi Roberts

1
ごめんね。express.bodyParserの後にapp.routerを使用する必要があります。
HenioJR 2014

1
ありがとう@LeviRoberts
HenioJR

4
var bodyParser = require('body-parser');
app.use(bodyParser.json());

これは私の日を救った。


4

この問題は、ボディパーサー(リンク)を使用していないことが原因である可能性があります

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

var app = express();
app.use(bodyParser.json());

3

私はそれを解決しました:

app.post('/', bodyParser.json(), (req, res) => {//we have req.body JSON
});

3

これも可能性の1つです。必ずapp.js(またはindex.js)ファイルのルートの前にこのコードを記述してください。

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

2

エクスプレスボディーパーサーを使用できます。

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));

2

Expressの最新バージョンには、すでにbody-parserが組み込まれています。だからあなたは使うことができます:

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

1

SOAPメッセージを投稿する場合は、未加工のボディパーサーを使用する必要があります。

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

app.use(bodyParser.raw({ type: 'text/xml' }));

1

@ kevin-xueに基づいて構築すると、コンテンツタイプを宣言する必要があります。私のインスタンスでは、XDomainRequestがcontent-typeを設定していないため、bodyparserとexpressjsがリクエストの本文を無視していたため、これはIE9でのみ発生していました

次のように、リクエストをボディパーサーに渡す前にcontent-typeを明示的に設定することで、これを回避しました。

app.use(function(req, res, next) {
    // IE9 doesn't set headers for cross-domain ajax requests
    if(typeof(req.headers['content-type']) === 'undefined'){
        req.headers['content-type'] = "application/json; charset=UTF-8";
    }
    next();
})
.use(bodyParser.json());

1

すばらしい答え(下記に提供)の@spikeyangへの謝辞 投稿に添付された提案記事を読んだ後、私は自分の解決策を共有することにしました。

いつ使用するのですか?

ソリューションでは、それを楽しむためにエクスプレスルーターを使用する必要がありました..:受け入れられた回答をうまく運ばなかった場合は、この関数をコピーして貼り付けてください:

function bodyParse(req, ready, fail) 
{
    var length = req.header('Content-Length');

    if (!req.readable) return fail('failed to read request');

    if (!length) return fail('request must include a valid `Content-Length` header');

    if (length > 1000) return fail('this request is too big'); // you can replace 1000 with any other value as desired

    var body = ''; // for large payloads - please use an array buffer (see note below)

    req.on('data', function (data) 
    {
        body += data; 
    });

    req.on('end', function () 
    {
        ready(body);
    });
}

そしてそれを次のように呼び出します:

bodyParse(req, function success(body)
{

}, function error(message)
{

});

注: ペイロードが大きい場合は、配列バッファーを使用してください(more @ MDN


bodyParserパッケージは一般的に使用され、ペイロードをbodyオブジェクトに変換します。他の回答で提供されているように
Schuere

1

外部ツールを使用してリクエストを行う場合は、必ずヘッダーを追加してください:

Content-Type: application/json


これは私を助けました、私はポストマンと一緒に働いていました、バディに感謝します。
R.グルン

1

上記の答えがどれもうまくいかなかった人のために、私は私のフロントエンドとエクスプレスの間のコアを有効にしなければなりませんでした。

次のいずれかの方法でこれを行うことができます。

  1. 次のようなブラウザのCORS拡張機能をダウンロードして有効にします。

    https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en

    Chromeの場合

または

  1. 行を追加する

    var cors=require('cors');
    
    app.use(cors());

あなたのエクスプレスapp.jsページに。(後npm install cors

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