Request: النشر مع مصفوفة فارغة في النموذج يزيل الخاصية

تم إنشاؤها على ١٥ أغسطس ٢٠١٧  ·  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: {}

إضافة قيمة خالية إلى سلوك تغييرات المصفوفة:

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

لكن إضافة غير معرف في المصفوفات لا يغير السلوك:

$ 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 / json" عندما يكون السؤال واضحًا حول "application / x-www-form-urlencoded". لا تزال هذه مشكلة تحدث ولكن للأسف لم يتم الاهتمام بها.

في الاختبار الذي أجريته ، ستختفي المصفوفات الفارغة وغير المعرفة في النتائج وسيظهر أي شيء "فارغ" في السلسلة المشفرة بعنوان url.

json من:
{ results: { arr1: [], arr2: undefined, arr3: null, foo: { arr4: [] } } }
سوف تسفر عن عنوان url مع فقط
"?results%5Barr3%5D="

ال 3 كومينتر

لذلك ، يبدو أنه يتم تحويل كائن JSON إلى سلسلة ويتم تعيينه كنص للطلب قبل إرساله. هذا هو السلوك الافتراضي عند تحديد سمة "النموذج". الطريقة التي تستخدمها هذه المكتبة لتحويل JSON إلى سلسلة تزيل المصفوفات الفارغة. ما عليك القيام به هو بدلاً من تمرير سمة "النموذج" ، قم بتمرير سمة "body" و JSON.stringify كائن JSON لتحويله إلى سلسلة. على سبيل المثال:

ملاحظة: قد يتعين عليك مراسلة الرؤوس واستخدام التطبيق / json كنوع المحتوى. لم أجرب لمعرفة ما يصلح.

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

تم وضع علامة على هذه المشكلة تلقائيًا على أنها قديمة نظرًا لعدم وجود نشاط حديث لها. سيتم إغلاقه إذا لم يحدث أي نشاط آخر. شكرا لمساهماتكم.

لا أصدق أنه ليس لدى أي من الأشخاص العاملين في هذا المشروع أي مدخلات في هذا الشأن. الجواب أعلاه غير صالح لأنه لا يفهم حالة الاستخدام المذكورة. لماذا نقدم عينة لـ "application / json" عندما يكون السؤال واضحًا حول "application / x-www-form-urlencoded". لا تزال هذه مشكلة تحدث ولكن للأسف لم يتم الاهتمام بها.

في الاختبار الذي أجريته ، ستختفي المصفوفات الفارغة وغير المعرفة في النتائج وسيظهر أي شيء "فارغ" في السلسلة المشفرة بعنوان url.

json من:
{ results: { arr1: [], arr2: undefined, arr3: null, foo: { arr4: [] } } }
سوف تسفر عن عنوان url مع فقط
"?results%5Barr3%5D="

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات