Request: フォームに空の配列を含む投稿はプロパティを削除します

作成日 2017年08月15日  ·  3コメント  ·  ソース: request/request

概要


投稿時のフォームには何らかの形の最適化があるようです。 これは私にとって悪いことです、それはフォームからプロパティを削除します。
空の配列を保持しているプロパティを持つオブジェクトを送信しようとしています。
配列が空になるたびに、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

stale

最も参考になるコメント

このプロジェクトに取り組んでいる人々の誰もがこれについて何の意見も持っていないことを信じることができません。 上記の答えは、上記のユースケースを理解していないため無効です。 明らかに「application / x-www-form-urlencoded」に関する質問であるのに、なぜ「application / json」のサンプルを提供するのですか。 これはまだ起こっている問題ですが、悲しいことに注意が向けられていません。

私のテストでは、未定義の空の配列は結果に表示されず、「null」はすべてurl-encoded-stringに表示されます。

のjson:
{ results: { arr1: [], arr2: undefined, arr3: null, foo: { arr4: [] } } }
のみのURLを生成します
"?results%5Barr3%5D="

全てのコメント3件

そのため、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="

このページは役に立ちましたか?
0 / 5 - 0 評価