Request: первый аргумент должен быть строкой буфера

Созданный на 16 нояб. 2015  ·  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 , не уверен в этих новых типах.

Что ж, in работал до сих пор, так что это означает, что не было проблем _ per se_ с отправкой этого нового встроенного типа (что бы это ни было и какое бы отношение оно ни было к Buffer),
было искусственно добавлено только какое-то условие if, которое вызывает ненужную ошибку.

Я нашел несколько исправлений, которые мог бы использовать, но считаю это несколько ненужным:
https://www.npmjs.com/package/uint8

Ошибка возникает из ядра, а не из этого модуля. Скорее всего, это связано с обновлением платформы - если вы обновили свою версию NodeJS. Вы используете запрос в браузере? Что, если состояние? Что работало до сих пор?

Нет, эта ошибка возникает, когда я запускаю ее на узле. Этого не произошло, пока я не обновил npm (вчера).
А потом, когда я перезаписал node_modules / request старым, он снова заработал.
Тогда довольно странно, что ошибка возникает из самого ядра узла.

Это странный idd. Я нашел двух возможных подозреваемых в прошлых PR, но мне нужен ваш _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 Не могли бы вы снова открыть это?

@banomaster @Ohar body должно быть String или Buffer

@simov О, спасибо.
я использовал

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

он возвращает JSON, но я получаю эту проблему (№ 1904) на удаленном сервере.
Используя res.json() fix, 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 г., 17: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 имеет значение true, тогда тело должно быть сериализуемым объектом 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: {}

Иногда лучшие ответы находятся в самом низу цепочки. Спасибо @itsyogesh @cozzbie

Ребята из @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 рейтинги