Как может суперагент и нок работать вместе? - программирование
Подтвердить что ты не робот

Как может суперагент и нок работать вместе?

В node.js у меня проблемы с суперагентством и ноком. Если я использую запрос вместо суперагента, он отлично работает.

Вот простой пример, когда суперагент не может сообщить об издевательских данных:

var agent = require('superagent');
var nock = require('nock');

nock('http://thefabric.com')
  .get('/testapi.html')
  .reply(200, {yes: 'it works !'});

agent
  .get('http://thefabric.com/testapi.html')
  .end(function(res){
    console.log(res.text);
  });

объект res не имеет свойства "text". Что-то пошло не так.

Теперь, если я делаю то же самое, используя запрос:

var request = require('request');
var nock = require('nock');

nock('http://thefabric.com')
  .get('/testapi.html')
  .reply(200, {yes: 'it works !'});

request('http://thefabric.com/testapi.html', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body)
  }
})

Изделенное содержимое отображается правильно.

Мы использовали суперагент в тестах, поэтому я предпочел бы придерживаться его. Кто-нибудь знает, как заставить его работать?

Большое спасибо, Xavier

4b9b3361

Ответ 1

Моя презумпция заключается в том, что Nock отвечает application/json как тип mime, так как вы отвечаете {yes: 'it works'}. Посмотрите res.body в суперагенте. Если это не сработает, сообщите мне, и я присмотрюсь ближе.

Edit:

Попробуйте следующее:

var agent = require('superagent');
var nock = require('nock');

nock('http://localhost')
.get('/testapi.html')
.reply(200, {yes: 'it works !'}, {'Content-Type': 'application/json'}); //<-- notice the mime type?

agent
.get('http://localhost/testapi.html')
.end(function(res){
  console.log(res.text) //can use res.body if you wish
});

или...

var agent = require('superagent');
var nock = require('nock');

nock('http://localhost')
.get('/testapi.html')
.reply(200, {yes: 'it works !'});

agent
.get('http://localhost/testapi.html')
.buffer() //<--- notice the buffering call?
.end(function(res){
  console.log(res.text)
});

Теперь один из них работает. Здесь я верю, что это происходит. nock не устанавливает тип mime, и предполагается значение по умолчанию. Я предполагаю, что значение по умолчанию application/octet-stream. Если это случай, суперагент затем не буферизует ответ для сохранения памяти. Вы должны заставить его его буферировать. Поэтому, если вы укажете тип mime, который должен иметь ваш HTTP-сервис, суперагент знает, что делать с application/json и почему, если вы можете использовать либо res.text, либо res.body (проанализированный JSON).