bodyParserは非推奨のExpress 4です


398

私はExpress 4.0を使用していますが、ボディパーサーがExpressコアから削除されていることを認識しています。推奨される代替品を使用していますが、

body-parser deprecated bodyParser: use individual json/urlencoded middlewares server.js:15:12 body-parser deprecated urlencoded: explicitly specify "extended: true" for extended parsing node_modules/body-parser/index.js:74:29

この想定されるミドルウェアはどこにありますか?または私はこのエラーを受けるべきではありませんか?

var express     = require('express');
var server      = express();
var bodyParser  = require('body-parser');
var mongoose    = require('mongoose');
var passport    = require('./config/passport');
var routes      = require('./routes');

mongoose.connect('mongodb://localhost/myapp', function(err) {
    if(err) throw err;
});

server.set('view engine', 'jade');
server.set('views', __dirname + '/views');

server.use(bodyParser()); 
server.use(passport.initialize());

// Application Level Routes
routes(server, passport);

server.use(express.static(__dirname + '/public'));

server.listen(3000);

回答:


730

これは、2014年6月19日の時点で、bodyParser() コンストラクターの使用が廃止たことを意味します。

app.use(bodyParser()); //Now deprecated

メソッドを個別に呼び出す必要があります

app.use(bodyParser.urlencoded());

app.use(bodyParser.json());

等々。

それでも警告が表示されるurlencoded場合は、

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

構成extendedオブジェクトキーにはデフォルト値がないため、明示的に渡す必要があります。

Express> = 4.16.0を使用している場合、ボディパーサーがメソッドexpress.json()およびの下に再度追加されましたexpress.urlencoded()


1
@eslammostafa bodyparserを使用できますが、コンストラクタを呼び出すことはできません。個々のメソッドを呼び出す必要があります。
ベンフォーチュン

2
@BenFortuneベンに感謝しました、私は/ tmpのことを心配していましたが、もう一度確認しましたが、/ tmpの問題は、bodyParserを使用してマルチパートフォームを解析した場合にのみ発生します。andrewkelley.me/post/do-not-use -bodyparser-with-express-js.htmlマルチパートフォームでは、手ごわいものを使用します。
schehata 14

23
何をしextendedますか?
Camilo Martin

1
違いの説明が役に立ちます。また、以下の両方を使用できることもわかります。しかし、なぜ?どのような点を考慮すべきですか?
ハリーモレノ

8
私は真の拡張について説明し最良の方法は、拡張手段を使用していないということである curl --data "user[email]=foo&user[password]=bar" localhost:3000/login にサーバによって受信されるだろうreq.body{ user[email]: "foo", ...}のに対しするreq.bodyだろう{user: {email: "foo", ... }}extended: true
reed_de_la_mer

156

警告をゼロにしたいですか?次のように使用します。

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

説明extendedオプションのデフォルト値は推奨されていません。つまり、trueまたはfalseの値を明示的に渡す必要があります。


1
私はこれを使用していますが、「body-parser deprecated」メッセージが表示されます。app.use(bodyParser.json()).use(bodyParser.urlencoded({ extended: true }));
Jeremy Thille、2015

6
それはそれが機能する方法ではありません。jsonとurlencodedにはapp.use()を個別に使用する必要があります
mr-karan

14

以前のバージョンのExpressでは、以下を使用する必要がありました。

app.use(express.bodyparser()); 

body-parserはnodeとexpressの間のミドルウェアだったからです。今、私たちはそれを次のように使わなければなりません:

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

「ボディパーサーはミドルウェアだった」と言いたいと思いますか?expressは、私が理解しているミドルウェアではありません
sakhunzai

9

express> 4.16を使用express.json()している場合は、およびexpress.urlencoded()

express.json()そしてexpress.urlencoded()ミドルウェアはリクエストボディの解析サポートを提供するために追加されたアウトオブボックス。これはexpressjs/body-parser下のモジュールモジュールを使用するため、現在モジュールを個別に必要としているアプリは、組み込みのパーサーに切り替えることができます。

Source Express 4.16.0-リリース日:2017-09-28

これとともに、

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

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

になる、

const express = require('express');

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

8

body-parserは、フォームの入力を読み取り、req.body 「body-parser」を介してアクセス可能なjavascriptオブジェクトとして保存する高速ミドルウェアの一部です(npm install --save body-parser詳細はを介してインストールする必要があります)。 -パーサー

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

場合extendedtrueに設定され、その後、収縮(圧縮)体が膨張します。ときextendedfalseに設定され、収縮した体が拒否されます。


2

without deprecated messagesログに表示される、最初にスケルトンプロジェクトを生成するexpress-generatorを使用するあなたの意見は何ですか

このコマンドを実行する

npm install express-generator -g

次に、このコマンドをに入力して、新しいExpress.jsスターターアプリケーションを作成しyour Node projects folderます。

express node-express-app

このコマンドは、新しいNode.jsアプリケーションをという名前で生成するようにexpressに指示しますnode-express-app

次にGo to the newly created project directory、コマンドinstall npm packagesstart the app使用して

cd node-express-app && npm install && npm start

1

追加中にそれが見つかりました

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

時々、それがExpressでどのように処理されるかを決定するのは、クエリの問題です。

たとえば、パラメータが本文ではなくURLで渡される可能性があります

このような場合、あなたは、キャプチャの両方に必要な身体URL(下記の場合は、本体のパラメータを優先して)、パラメータおよび使用可能な方の使用

app.route('/echo')
    .all((req,res)=>{
        let pars = (Object.keys(req.body).length > 0)?req.body:req.query;
        res.send(pars);
    });

-1

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

私は同じ問題を抱えていますが、これでうまくいきます。この拡張部分を試すことができます。

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