Request: argumen pertama harus berupa string Buffer

Dibuat pada 16 Nov 2015  ·  25Komentar  ·  Sumber: request/request

Hai, saya menjalankan beberapa kode dan mendapat pesan kesalahan ini:

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

Lucunya, jika saya mengganti versi modul permintaan saat ini dengan yang lebih lama (### v2.60.0 (2015/07/21), menurut changelog), semuanya berfungsi dengan baik.

Kode yang menyebabkan kesalahan ini adalah ini:

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

Komentar yang paling membantu

Pada dasarnya jangan gunakan body: {} dalam permintaan Anda. Jika Anda ingin meneruskan data di badan, gunakan json: {} sebagai gantinya

Semua 25 komentar

Tipe data apakah body ? Juga tidak ada properti responseType .

Ini dia: body = new Uint8Array(request.toArrayBuffer())
Saya tahu tidak ada resopnseType, tetapi itu tidak masalah (karena berhasil), bukan?

Jadi, pada dasarnya body harus berupa String atau Buffer , tidak yakin tentang tipe baru ini.

Nah, dalam bekerja sampai sekarang, jadi itu berarti tidak ada masalah _per se_ dengan mengirim tipe bawaan baru ini (apa pun itu dan apa pun hubungannya dengan Buffer),
hanya beberapa if-condition yang ditambahkan secara artifisial yang menimbulkan kesalahan yang tidak perlu.

Saya menemukan beberapa perbaikan terbaru yang dapat saya gunakan, saya hanya merasa agak tidak perlu:
https://www.npmjs.com/package/uint8

Kesalahan dilemparkan dari inti, bukan dari modul ini. Itu kemungkinan besar terkait dengan peningkatan platform - jika Anda meningkatkan versi NodeJS Anda. Apakah Anda menggunakan permintaan di browser? Bagaimana jika kondisi? Apa yang berhasil sampai sekarang?

Tidak, kesalahan ini terjadi, ketika saya menjalankannya di node.js. Itu tidak terjadi sampai saya memutakhirkan npm (kemarin).
Dan kemudian ketika saya menimpa node_modules/request dengan yang lama, itu mulai bekerja lagi.
Maka cukup aneh bahwa kesalahan dilemparkan dari inti simpul itu sendiri.

Itu aneh id. Saya menemukan dua kemungkinan tersangka di PR masa lalu, tetapi saya memerlukan kode _exact_ Anda untuk mereproduksi bug - contoh kode mandiri kecil yang dapat saya jalankan.

Bagaimana dengan kode ini?

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

Diperbaiki di sini #1905

Super, terima kasih! :)

Hai teman-teman,

saya telah menginstal versi 2.70.0, tetapi saya masih berjuang dengan kesalahan yang sama ini:

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)

Ini adalah kode saya yang saat ini saya gunakan:

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

Saya harap kode dan pertanyaan saya cukup jelas.

Punya kesalahan ini juga.

@novelizator Bisakah Anda membuka kembali ini?

@banomaster @Ohar body harus String atau Buffer

@simov Oh terima kasih.
saya menggunakan

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

itu mengembalikan JSON, tetapi saya mendapatkan masalah ini (# 1904) di server jauh.
Menggunakan res.json() memperbaiki masalah, karena ia lolos dari JSON dan merangkainya. Tetapi saya perlu mendapatkan JSON sebagai tanggapan dan ketika saya menggunakan res.json , itu malah mengirimi saya string yang lolos.
Bisakah Anda membantu saya dengan itu?

Contoh

Pawang

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

Resonansi sebenarnya

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

Respon yang diinginkan

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

Setel opsi json ke true , lihat juga bagian opsi di dokumen.
Pertanyaan terakhir Anda tidak terkait dengan masalah ini, posting yang baru jika Anda memiliki pertanyaan lain.

Wow, tim permintaan bravo, cara merusak antarmuka tanpa memutakhirkan versi utama :/

@mboudreau dapatkah Anda membuka masalah lain dan menjelaskan dengan tepat apa yang tidak berhasil untuk Anda?

Pada dasarnya, saya telah menggunakan permintaan sejak 2.64.x, dan saya selalu hanya
menggunakan objek dalam tubuh yang diserialisasikan secara otomatis berdasarkan permintaan,
tapi sejak versi terbaru, ini tidak terjadi lagi. Ini pada dasarnya
merusak beberapa bangunan saya pada saat yang sama ketika versi baru keluar
dengan pesan kesalahan yang sangat samar.

Alasan saya kesal adalah karena standar versi semantik mengatakan
bahwa ketika perubahan yang melanggar diperkenalkan, versi utama perlu
bertambah. Seperti yang Anda lihat dari utas ini, versi fitur terbaru
bangkrut bagi banyak orang dan secara pribadi menyebabkan saya banyak frustrasi dan terbuang
waktu mencoba untuk mencari atau kesalahan ini.

Saya tidak berpikir itu layak untuk tiketnya sendiri, tetapi hanya peringatan dari
perubahan dan untuk memastikan untuk mengikuti versi semantik dengan benar.

Pada Jumat, 29 April 2016, 17:28 simo [email protected] menulis:

@mboudreau https://github.com/mboudreau dapatkah Anda membuka edisi lain?
dan jelaskan dengan tepat apa yang tidak berhasil untuk Anda?


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung atau lihat di GitHub
https://github.com/request/request/issues/1904#issuecomment -215646824

Saya masih tidak yakin apa perilaku yang diharapkan dalam kasus Anda? Apakah Anda mengharapkan untuk meneruskan objek ke opsi body dan mengirim JSON string atau badan querystring?

Bagaimanapun, Anda harus memberikan contoh kode untuk mereproduksi bug. Dari dokumen:

body - badan entitas untuk permintaan PATCH, POST dan PUT. Harus berupa Buffer, String, atau ReadStream. Jika json benar, maka body harus menjadi objek yang dapat diserialisasikan JSON.

Anda dapat menguji ini:

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

Lihat hasilnya di sini . Seperti yang Anda lihat, body adalah objek JSON yang dirangkai.

Hai semuanya, saya telah mengutak-atik kesalahan ini untuk sementara waktu, dan inilah yang saya temukan. Ketika params permintaan posting bertipe: {form: {key: 1}} secara otomatis membuat serial parameter posting, tetapi ketika itu adalah sesuatu yang lain, katakan {body: {key: 1}} itu melempar kesalahan new TypeError('first argument must be a string or Buffer'); .

Untuk mengatasinya, saya baru saja melakukan {body: JSON.stringify({key: 1})} dan permintaan berhasil. Saya belum melihat ke sumbernya, tetapi ini berhasil untuk saya.

Juga, jika kita menetapkan json: true di objek opsi, secara otomatis membuat serial params permintaan.

Pada dasarnya jangan gunakan body: {} dalam permintaan Anda. Jika Anda ingin meneruskan data di badan, gunakan json: {} sebagai gantinya

Terkadang jawaban terbaik adalah bagian paling bawah dari sebuah utas. Terima kasih @itsyogesh @cozzbie

@novelizator guys ini adalah masalah tertutup, tapi saya bingung karena saya melakukan itu untuk gambar biner dan mendapatkan kesalahan yang sama:

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

Hei, baru saja menemukan solusi untuk ini. Saya mengirim json body , tetapi saya perlu mengonversinya menjadi string dengan body: JSON.stringify(body)

Saya menggunakan Uint8Array sebagai tubuh saya tanpa kesalahan, tetapi ketika saya mengirim permintaan di mana array memiliki panjang nol, tiba-tiba muncul kesalahan. Mungkin ada sedikit bug validasi di sana, dengan satu atau lain cara.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat