投稿時のフォームには何らかの形の最適化があるようです。 これは私にとって悪いことです、それはフォームからプロパティを削除します。
空の配列を保持しているプロパティを持つオブジェクトを送信しようとしています。
配列が空になるたびに、MissingPropertyErrorが返されます。これは、空の配列が実際にはプロパティをまったく持たないことよりも価値を保持しているため、正しくありません。
const request = require( 'request' )
const bodyParser = require('body-parser')
const app = require('express')()
app.use( bodyParser.json() )
app.use( bodyParser.urlencoded( { extended: true } ) )
app.post('/', function( req, res ){
console.log( 'received:', req.body )
res.send('ok')
})
app.listen( 53153 )
const req = {
url: 'http://localhost:53153',
method: 'POST',
headers: {
'Content-Type' : 'application/x-www-form-urlencoded'
},
form: {
emptyArray: [],
filledArray: [{something:[]}]
}
}
console.log( 'sending:', req )
request( req , function( err, httpResponse, body ){
process.exit(0)
})
有効なjsonであるため、送信オブジェクトが受信されることを期待していました
$ node index.js
sending: { url: 'http://localhost:53153',
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
form: { emptyArray: [], filledArray: [ { something: [] } ] }
received: { emptyArray: [], filledArray: [ { something: [] } ] }
受信したオブジェクトは空のオブジェクトに過ぎないことがわかります。wiresharkを見ると、送信されるコンテンツの長さは0です。
$ node index.js
sending: { url: 'http://localhost:53153',
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
form: { emptyArray: [], filledArray: [ { something: [] } ] }
received: {}
配列にnullを追加すると、動作が変わります。
$ node index.js
sending: { url: 'http://localhost:53153',
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
form: { emptyArray: [ null ], filledArray: [ { something: [ null ] } ] }
received: { emptyArray: [ '' ], filledArray: [ { something: [ '' ] } ] }
ただし、配列にundefinedを追加しても、動作は変わりません。
$ node index.js
sending: { url: 'http://localhost:53153',
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
form: { emptyArray: [ undefined ], filledArray: [ { something: [ undefined ] } ] }
received: {}
| ソフトウェア| バージョン
| ---------------- | -------
| リクエスト| 2.81.0
| ノード| 8.3.0
| npm | 5.1.0
| オペレーティングシステム| Ubuntu 16.04.2 LTS
そのため、JSONオブジェクトが文字列に変換され、送信される前にリクエストの本文として設定されているように見えます。 これは、「form」属性を指定した場合のデフォルトの動作です。 このライブラリがJSONを文字列に変換するために使用するメソッドは、空の配列を削除します。 'form'属性を渡す代わりに、 'body'属性を渡し、JSONオブジェクトをJSON.stringifyして文字列に変換する必要があります。 例えば:
注:ヘッダーをいじって、コンテンツタイプとしてapplication / jsonを使用する必要がある場合があります。 何が機能するかを確認するための実験は行っていません。
{
url: 'http://localhost:53153',
method: 'POST',
headers: { 'Content-Type': 'application/json'},
body: JSON.stringify({ emptyArray: [], filledArray: [ { something: [] } ] })
}
この問題は、最近のアクティビティがないため、自動的に古いものとしてマークされています。 それ以上のアクティビティが発生しない場合は閉じられます。 貢献していただきありがとうございます。
このプロジェクトに取り組んでいる人々の誰もがこれについて何の意見も持っていないことを信じることができません。 上記の答えは、上記のユースケースを理解していないため無効です。 明らかに「application / x-www-form-urlencoded」に関する質問であるのに、なぜ「application / json」のサンプルを提供するのですか。 これはまだ起こっている問題ですが、悲しいことに注意が向けられていません。
私のテストでは、未定義の空の配列は結果に表示されず、「null」はすべてurl-encoded-stringに表示されます。
のjson:
{
results: {
arr1: [],
arr2: undefined,
arr3: null,
foo: {
arr4: []
}
}
}
のみのURLを生成します
"?results%5Barr3%5D="
最も参考になるコメント
このプロジェクトに取り組んでいる人々の誰もがこれについて何の意見も持っていないことを信じることができません。 上記の答えは、上記のユースケースを理解していないため無効です。 明らかに「application / x-www-form-urlencoded」に関する質問であるのに、なぜ「application / json」のサンプルを提供するのですか。 これはまだ起こっている問題ですが、悲しいことに注意が向けられていません。
私のテストでは、未定義の空の配列は結果に表示されず、「null」はすべてurl-encoded-stringに表示されます。
のjson:
{ results: { arr1: [], arr2: undefined, arr3: null, foo: { arr4: [] } } }
のみのURLを生成します
"?results%5Barr3%5D="