Request: يجب أن تكون الوسيطة الأولى سلسلة من Buffer

تم إنشاؤها على ١٦ نوفمبر ٢٠١٥  ·  25تعليقات  ·  مصدر: request/request

مرحبًا ، كنت أقوم بتشغيل بعض التعليمات البرمجية وتلقيت رسالة الخطأ هذه:

_http_outgoing.js:441
    throw new TypeError('first argument must be a string or Buffer');
    ^

TypeError: first argument must be a string or Buffer
    at ClientRequest.OutgoingMessage.write (_http_outgoing.js:441:11)
    at Request.write (/Users/tomasnovella/workspace/kitt/kitt-chrome-sync/node_modules/request/request.js:1392:25)
    at end (/Users/tomasnovella/workspace/kitt/kitt-chrome-sync/node_modules/request/request.js:550:16)
    at Immediate._onImmediate (/Users/tomasnovella/workspace/kitt/kitt-chrome-sync/node_modules/request/request.js:578:7)
    at processImmediate [as _immediateCallback] (timers.js:383:17)

الشيء المضحك هو أنني إذا استبدلت الإصدار الحالي من وحدة الطلب بأخرى أقدم (### v2.60.0 (2015/07/21) ، وفقًا لسجل التغيير) ، فإن كل شيء يعمل بشكل جيد.

الكود الذي يسبب هذا الخطأ هو:

  request.post({
        url: '<someURL>',
        qs: {
          'client': 'Google+Chrome',
          'client_id': config.clientId
        },
        headers: {
          'Content-Type': 'application/octet-stream',
          'Authorization': 'Bearer '+ accessToken
        },
        encoding: null, //  if you expect binary data
        responseType: 'buffer', 
        body: body
    }, (error, response, body) => {..blah...});

التعليق الأكثر فائدة

في الأساس لا تستخدم body: {} في طلبك. إذا كنت تريد تمرير البيانات في الجسم ، فاستخدم json: {} بدلاً من ذلك

ال 25 كومينتر

ما هو نوع البيانات body ؟ كما لا توجد خاصية responseType .

إنه هذا: body = new Uint8Array(request.toArrayBuffer())
أعلم أنه لا يوجد نوع resopnseType ، لكن هذا لا يهم (لأنه يعمل) ، أليس كذلك؟

لذلك ، يجب أن يكون الجسم إما String أو Buffer ، لست متأكدًا من هذه الأنواع الجديدة.

حسنًا ، في العمل حتى الآن ، فهذا يعني أنه لم تكن هناك مشكلة _ per se_ في إرسال هذا النوع المدمج الجديد (أيًا كان ذلك وأيًا كانت علاقته بـ Buffer) ،
تمت إضافة بعض الشروط الشرطية بشكل مصطنع فقط مما يؤدي إلى حدوث خطأ غير مؤكد.

لقد وجدت بعض الإصلاحات العاجلة التي يمكنني استخدامها ، ولكني أجدها غير ضرورية إلى حد ما:
https://www.npmjs.com/package/uint8

تم طرح الخطأ من الأساس وليس من هذه الوحدة. من المحتمل أن يكون هذا مرتبطًا بترقية النظام الأساسي - في حالة ترقية إصدار NodeJS الخاص بك. هل تستخدم الطلب في المتصفح؟ ماذا لو الشرط؟ ما الذي كان يعمل حتى الآن؟

لا ، يحدث هذا الخطأ عندما أقوم بتشغيله على العقدة. لم يحدث ذلك حتى قمت بالترقية npm (أمس).
وبعد ذلك عندما قمت بالكتابة فوق node_modules / request بالقديم ، بدأت تعمل مرة أخرى.
ثم من الغريب أن الخطأ قد تم طرحه من نواة العقدة نفسها.

هذا غريب idd. لقد وجدت اثنين من المشتبه بهم المحتملين في العلاقات العامة السابقة ، لكني أحتاج إلى رمز _exact_ الخاص بك لإعادة إنتاج الخطأ - مثال صغير للرمز محتفظ به ذاتيًا يمكنني تشغيله.

ماذا عن هذا الرمز؟

var request = require('request');
request.post({
        url: 'https://clients4.google.com/chrome-sync/command',
        qs: {
          'client': 'Google+Chrome',
           'client_id': '12345'
        },
        headers: {
          'Content-Type': 'application/octet-stream',
          'Authorization': 'Bearer 123'
        },
        encoding: null, //  if you expect binary data
        responseType: 'buffer',
        body: new Uint8Array(3)
      }, function(e,r,b){console.log(e,r,b)});

ثابت هنا # 1905

سوبر بفضل! :)

مرحبا شباب،

لقد قمت بتثبيت الإصدار 2.70.0 ، لكنني ما زلت أعاني من نفس الخطأ:

TypeError: first argument must be a string or Buffer
    at ServerResponse.OutgoingMessage.end (_http_outgoing.js:524:11)
    at /Users/urbanmarovt/Documents/Faks/BCH/Diploma/PoC/gateway/routes/index.js:87:17
    at Request._callback (/Users/urbanmarovt/Documents/Faks/BCH/Diploma/PoC/gateway/routes/proxy.js:81:7)
    at Request.self.callback (/Users/urbanmarovt/Documents/Faks/BCH/Diploma/PoC/gateway/node_modules/request/request.js:200:22)

هذا هو الكود الخاص بي الذي أستخدمه حاليًا:

var options = {
      url: url,
      path: req.path,
      qs: req.query,
      method: req.method,
      headers: headers,
      responseType: 'buffer',
      timeout: TIMEOUT
    };

 options.json = true;
 options.body = {
        "firstName": "Test1",
        "lastName": "Test2",
        "email": "[email protected]",
        "mobilePhone": "+38631288288"
 };

 request(options, function (error, response, body) {
      callback(error, response, body, options);
    });

آمل أن يكون الرمز والسؤال واضحين بدرجة كافية.

حصلت على هذا الخطأ أيضا.

novellizator هل يمكنك إعادة فتح هذا من فضلك؟

banomasterOhar body يجب أن يكون String أو Buffer

simov أوه شكرا لك.
انا إستعملت

res.write(data);
res.end();

تقوم بإرجاع JSON ، لكني أحصل على هذه المشكلة (# 1904) على الخادم البعيد.
باستخدام res.json() fix problem ، bcz يهرب من JSON ويضبطه. لكني أحتاج إلى الحصول على JSON ردًا ، وعندما أستخدم res.json ، فإنه يرسل لي سلسلة مهروسة بدلاً من ذلك.
هل يمكنك مساعدتي في ذلك؟

مثال

معالج

function foo (req, res) {
  request.post(
    'https://example.com/api',
    {form: data},
    function (error, response, body) {
      res.json(body);
    }
  );
}

الاستجابة الفعلية

"{\"response\":{\"data\":{}},\"status\":0}"

استجابة المطلوب

{
    "response": {
        "data": {}
    },
    "status": 0
}

اضبط الخيار json على true ، ألق نظرة أيضًا على قسم الخيارات في المستندات.
لا يتعلق سؤالك الأخير بهذه المشكلة ، فقم بإرسال سؤال جديد إذا كانت لديك أسئلة أخرى.

واو ، فريق طلب برافو ، طريقة لكسر الواجهة دون ترقية الإصدارات الرئيسية: /

mboudreau هل يمكنك فتح مشكلة أخرى وشرح بالضبط ما الذي لا يناسبك؟

بشكل أساسي ، كنت أستخدم الطلب منذ 2.64.x ، وأنا دائمًا فقط
استخدم عنصرًا في الجسم تم إجراء تسلسل له تلقائيًا حسب الطلب ،
ولكن منذ الإصدار الأخير ، لم يعد هذا هو الحال بعد الآن. هذا في الأساس
كسر العديد من بنياتي في نفس الوقت الذي ظهر فيه الإصدار الجديد
برسالة خطأ مشفرة للغاية.

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

لا أعتقد أنه يستحق تذكرة خاصة به ، ولكن مجرد تحذير من
التغييرات والتأكد من اتباع الإصدار الدلالي بشكل صحيح.

في الجمعة ، 29 أبريل 2016 ، 5:28 مساءً كتب simo [email protected] :

mboudreau https://github.com/mboudreau هل يمكنك فتح مشكلة أخرى
وشرح بالضبط ما الذي لا يصلح لك؟

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/request/request/issues/1904#issuecomment -215646824

ما زلت غير متأكد ما هو السلوك المتوقع في حالتك؟ هل تتوقع تمرير كائن إلى الخيار body وإرسال JSON مشدود أو نص استعلام؟

في كلتا الحالتين ، يجب عليك تقديم مثال رمز لإعادة إنتاج الخطأ. من المستندات:

body - هيئة الكيان لطلبات PATCH و POST و PUT. يجب أن يكون Buffer أو String أو ReadStream. إذا كانت json صحيحة ، فيجب أن يكون الجسم كائنًا قابلاً للتسلسل بتنسيق JSON.

يمكنك اختبار هذا:

request({
  method: 'POST',
  url: 'http://requestb.in/tr4jaxtr',
  body: {a: 1},
  json: true,
  callback: (err, res, body) => {
    if (err) {
      console.log(err)
    }
    console.log(body)
  }
})

انظر النتائج هنا . كما ترى الجسم عبارة عن كائن JSON مشدود.

مرحبًا بالجميع ، لقد كنت أعاني من هذا الخطأ منذ فترة ، وهذا ما اكتشفته. عندما تكون معلمات طلب النشر من النوع: {form: {key: 1}} فإنها تقوم تلقائيًا بتسلسل معلمات المشاركة ، ولكن عندما تكون معلمات أخرى ، قل {body: {key: 1}} فإنها تلقي بالخطأ new TypeError('first argument must be a string or Buffer'); .

للتغلب على هذا ، قمت للتو بـ {body: JSON.stringify({key: 1})} ونجح الطلب. لم ألق نظرة على المصدر بعد ، لكن هذا نجح معي.

أيضًا ، إذا قمنا بتعيين json: true في كائن الخيارات ، فسيتم تلقائيًا تسلسل معلمات الطلب.

في الأساس لا تستخدم body: {} في طلبك. إذا كنت تريد تمرير البيانات في الجسم ، فاستخدم json: {} بدلاً من ذلك

في بعض الأحيان تكون أفضل الإجابات هي الجزء السفلي من الموضوع. بفضلitsyogeshcozzbie

novellizator يا رفاق ، كانت هذه مشكلة مغلقة ، لكنني في حيرة لأنني أفعل ذلك من أجل صورة ثنائية وأحصل على نفس الخطأ:

app.post(self._options.baseUrl + '/image.post', function (req, res) {

                delete req.headers.host;

                var headers= req.headers;
                headers['Content-Type'] = 'application/octet-stream';

                request.post('http://localhost:9080/image.post',
                    {
                        headers: headers,
                        encoding: null, //  if you expect binary data
                        responseType: 'buffer',
                        body: req.body
                    },
                    function (error, response, body) {
                        if (!error && response.statusCode == 200) {
                            res.send(body);
                            res.end();
                        } else {
                            res.send({ error: new Error('image error') });
                            res.end();
                        }
                    })
            })

مرحبًا ، لقد توصلت للتو إلى حل لهذا. كنت أرسل json body ، لكنني كنت بحاجة إلى تحويله إلى سلسلة بـ body: JSON.stringify(body)

كنت أستخدم Uint8Array كجسمي بدون أخطاء ، ولكن عندما أرسلت طلبًا حيث الصفيف ذات طول صفري ، فقد حدث خطأ فجأة. ربما يكون هناك خطأ في التحقق من الصحة ، بطريقة أو بأخرى.

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