web-dev-qa-db-ja.com

`app.use(bodyParser.json())`は何をしますか?

ために:

bodyParser.urlencoded({extended: ...})

私の研究では、extended: trueの場合、ネストされたオブジェクト、または一般的にあらゆるタイプを解析できることが示されています。ただし、extended: falseを設定した場合、解析できるのは文字列または配列のみです。しかし、何が...

app.use(bodyParser.json())

正確に?つまり、はい... jsonを解析することをドキュメントで言及していることは知っています。しかし、私はまだ混乱しています。 extended: trueを設定するアプリケーションがbodyParser.json()をまったく使用しないことに気付きました。ただし、extended: falseを使用するアプリケーションはbodyParser.json()を使用する傾向があります。どうしてこれなの?結局のところ、両方のアプリケーションはjsonを解析できます。

第二に、推奨されるアプローチはどれですか?

40
Grateful

さて、私が以前考えていたのとは反対に、さらなる研究により、extended: trueapp.use(bodyParser.json())を一緒に使用できることが示されています。したがって、それを使用するのはextended: falseだけではありません。 trueまたはfalseのいずれとして拡張を設定したかにかかわらず、ステートメントapp.use(bodyParser.json())は独立して使用されます。

  • app.use(bodyParser.json())は、基本的にjsonを使用したいことをシステムに伝えます。

  • bodyParser.urlencoded({extended: ...})は基本的に、浅い構文解析に単純なアルゴリズムを使用するか(つまりfalse)、ネストされたオブジェクトを処理できる深い構文解析に複雑なアルゴリズムを使用するか(つまりtrue)をシステムに指示します。

例については、ドキュメント(つまり https://expressjs.com/en/guide/migrating-4.html )をご覧ください。

68
Grateful

URLエンコーディングとJSONエンコーディングはどちらも(ネストされた)オブジェクトを文字列に変換できますが、形式は異なります。一般的に、URLエンコードされた文字列は有効なJSON文字列ではありません。

1つのアプリケーションで1つのエンコード方式を使用し、別のアプリケーションで別のエンコード方式を使用する場合があります。彼らが2つを混ぜない限り、それは機能します。

6
trincot

bodyParser.jsonは、jsonのみを解析するミドルウェアを返します。このパーサーは、ボディのUnicodeエンコーディングを受け入れ、gzipの自動インフレーションとデフレートエンコーディングをサポートします。

解析されたデータを含む新しい本体オブジェクトは、ミドルウェアの後にリクエストオブジェクト(つまり、req.body)に入力されます。

3
Malatesh Patil