Как опубликовать массив объектов с помощью Chai Http

Я пытаюсь опубликовать массив объектов с ChaiHttp следующим образом:

agent.post('route/to/api')
  .send( locations: [{lat: lat1, lon: lon1}, {lat: lat2, lon: lon2}])
  .end (err, res) -> console.log err, res

Он возвращает ошибку, как показано ниже:

 TypeError: first argument must be a string or Buffer
at ClientRequest.OutgoingMessage.end (_http_outgoing.js:524:11)
at Test.Request.end (node_modules/superagent/lib/node/index.js:1020:9)
at node_modules/chai-http/lib/request.js:251:12
at Test.then (node_modules/chai-http/lib/request.js:250:21)

Events.js:141 метатель; // Необработанное событие "ошибка" ^

Ошибка: неправильная проверка заголовка в Zlib._handle.onerror (zlib.js:363:17)

Я также пытался опубликовать так, как мы делаем с почтальоном:

agent.post('route/to/api')
  .field( 'locations[0].lat', xxx)
  .field( 'locations[0].lan', xxx)
  .field( 'locations[1].lat', xxx)
  .field( 'locations[2].lat', xxx)
  .then (res) -> console.log res

но payload.locations принимается как неопределенное.

Любая идея, как опубликовать массив объектов через chai-http?

ИЗМЕНИТЬ:

Вот мой маршрут, и я думаю, что что-то не так с полезной нагрузкой потока:

method: 'POST'
path:
config:
  handler: my_handler
  payload:
    output: 'stream'

person Reza Owliaei    schedule 10.04.2016    source источник
comment
@ Катберт, нет. Метод field принимает строки в качестве второго аргумента. Вместо этого я использовал JSON.stringify и сделал свой пост. Однако я понял, что основная проблема заключается либо в суперагенте, либо в выводе полезной нагрузки.   -  person Reza Owliaei    schedule 11.04.2016


Ответы (3)


У меня была такая же проблема здесь. Кажется, что просто документация chai-http неверна. Он говорит:

// Send some Form Data
chai.request(app)
 .post('/user/me')
 .field('_method', 'put')
 .field('password', '123')
 .field('confirmPassword', '123')

Который НЕ работает. Это сработало для меня:

chai.request(app)
  .post('/create')
  .send({ 
      title: 'Dummy title',
      description: 'Dummy description'
  })
  .end(function(err, res) { ... }
person Robert    schedule 29.04.2016
comment
Как это отвечает на вопрос? - person Pratik Singhal; 06.09.2017
comment
Это не отвечает на вопрос, и это даже не правильный способ сделать это. Что, если бы вы отправляли файлы через multipart/formdata? - person Stanley; 23.01.2021

Попробуйте использовать .send({locations: [{lat: lat1, lon: lon1}, {lat: lat2, lon: lon2}]}). Потому что .field('a', 'b') не работает.

  1. body как данные формы

    .put('/path/endpoint')
    .type('form')
    .send({foo: 'bar'})
    // .field('foo' , 'bar')
    .end(function(err, res) {}
    
    // headers received, set by the plugin apparently
    'accept-encoding': 'gzip, deflate',
    'user-agent': 'node-superagent/2.3.0',
    'content-type': 'application/x-www-form-urlencoded',
    'content-length': '127',
    
  2. body as application/json

    .put('/path/endpoint')
    .set('content-type', 'application/json')
    .send({foo: 'bar'})
    // .field('foo' , 'bar')
    .end(function(err, res) {}
    
    // headers received, set by the plugin apparently
    'accept-encoding': 'gzip, deflate',
    'user-agent': 'node-superagent/2.3.0',
    'content-type': 'application/json',
    'content-length': '105',
    
person Green    schedule 21.06.2017

Столкнулся с той же проблемой, и мое решение заключалось не в использовании объекта JSON для метода отправки, а в необработанной строке:

    chai.request(uri)
        .post("/auth")
        .set('content-type', 'application/x-www-form-urlencoded')
        .send(`Login[Username]=${validUser1.username}`)
        .send(`Login[Password]=${validUser1.password}`)
        .send(`RememberMe=false`)
        .end((err, res) => {
            res.should.have.status(200);
            // ...
        });
person OsMinOsM    schedule 30.09.2020