Request: Posting dengan array kosong dalam bentuk menghapus properti

Dibuat pada 15 Agu 2017  ·  3Komentar  ·  Sumber: request/request

Ringkasan


Tampaknya ada beberapa bentuk optimasi dalam bentuk saat memposting. Ini buruk bagi saya, ini menghapus properti dari formulir.
Saya mencoba mengirim objek dengan properti yang menyimpan array yang mungkin kosong.
Setiap kali array kosong, MissingPropertyError dikembalikan yang salah karena array kosong sebenarnya memiliki nilai daripada tidak memiliki properti sama sekali.

Contoh Paling Sederhana untuk Direproduksi

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)
})

Perilaku yang Diharapkan




Saya berharap objek kirim akan diterima, karena itu json yang valid

$ 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: [] } ] }

Perilaku Saat Ini



Ternyata objek yang diterima tidak lain adalah objek kosong, melihat wireshark panjang konten yang dikirim adalah 0.

$ node index.js
sending: { url: 'http://localhost:53153',
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  form: { emptyArray: [], filledArray: [ { something: [] } ] }
received: {}

menambahkan null ke array mengubah perilaku:

$ 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: [ '' ] } ] }

namun menambahkan undefined dalam array tidak mengubah perilaku:

$ 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: {}

Kemungkinan Solusi


Konteks


Lingkungan Anda

| perangkat lunak | Versi: kapan
| ---------------- | -------
| permintaan | 2.81.0
| simpul | 8.3.0
| npm | 5.1.0
| Sistem Operasi | Ubuntu 16.04.2 LTS

stale

Komentar yang paling membantu

tidak percaya bahwa tidak ada orang yang mengerjakan proyek ini yang memiliki masukan tentang ini. jawaban di atas tidak valid karena tidak memahami kasus penggunaan yang disebutkan. Mengapa kami memberikan contoh untuk "application/json" padahal pertanyaannya jelas tentang" application/x-www-form-urlencoded". Ini adalah masalah yang masih terjadi tetapi sayangnya tidak diperhatikan.

Dalam pengujian saya, array yang tidak terdefinisi dan kosong akan hilang dalam hasil dan apa pun 'null' akan muncul di url-encoded-string.

sebuah json dari:
{ results: { arr1: [], arr2: undefined, arr3: null, foo: { arr4: [] } } }
akan menghasilkan url hanya dengan
"?results%5Barr3%5D="

Semua 3 komentar

Jadi, tampaknya objek JSON diubah menjadi string dan disetel sebagai badan permintaan sebelum dikirim. Ini adalah perilaku default saat Anda menentukan atribut 'form'. Metode yang digunakan library ini untuk mengonversi JSON menjadi string menghapus array kosong. Yang perlu Anda lakukan adalah alih-alih meneruskan atribut 'form', meneruskan atribut 'body' dan JSON.stringify objek JSON Anda untuk mengubahnya menjadi string. Sebagai contoh:

CATATAN: ANDA MUNGKIN HARUS MENGGUNAKAN HEADER DAN MENGGUNAKAN application/json sebagai tipe konten. Saya belum bereksperimen untuk melihat apa yang berhasil.

{
    url: 'http://localhost:53153',
    method: 'POST',
    headers: { 'Content-Type': 'application/json'},
    body: JSON.stringify({ emptyArray: [], filledArray: [ { something: [] } ] })
}

Masalah ini secara otomatis ditandai sebagai basi karena tidak ada aktivitas terbaru. Ini akan ditutup jika tidak ada aktivitas lebih lanjut yang terjadi. Terima kasih atas kontribusi Anda.

tidak percaya bahwa tidak ada orang yang mengerjakan proyek ini yang memiliki masukan tentang ini. jawaban di atas tidak valid karena tidak memahami kasus penggunaan yang disebutkan. Mengapa kami memberikan contoh untuk "application/json" padahal pertanyaannya jelas tentang" application/x-www-form-urlencoded". Ini adalah masalah yang masih terjadi tetapi sayangnya tidak diperhatikan.

Dalam pengujian saya, array yang tidak terdefinisi dan kosong akan hilang dalam hasil dan apa pun 'null' akan muncul di url-encoded-string.

sebuah json dari:
{ results: { arr1: [], arr2: undefined, arr3: null, foo: { arr4: [] } } }
akan menghasilkan url hanya dengan
"?results%5Barr3%5D="

Apakah halaman ini membantu?
0 / 5 - 0 peringkat