узел-выборка получает пустое тело

#javascript #node.js #http #chai

#javascript #node.js #http #чай

Вопрос:

Я пишу модульные тесты для простого приложения NodeJS и по какой-то причине не могу получить тело ответа. Он получает правильный код ответа (либо 200 для успешных запросов, либо 422 для недействительных), но тело кажется пустым. Кроме того, когда я делаю точно такой же запрос с помощью httpie, это работает как шарм. Ведение журнала также показывает, что контроллер работает должным образом.

Любые идеи или предложения приветствуются.

Вот часть контроллера:

 function register (req, res) {
  return _findUser({email: req.body.email})
    .then(user => {
      if (user) {
        console.log('EMAIL TAKEN');
        return Promise.reject({message: 'This email is already taken'});
      }

      let params = _filterParams(req.body);
      if (_isRegistrationValid(params)) {
        console.log('REGISTRATION VALID');
        return params;
      } else {
        console.log('PARAMS INVALID');
        return Promise.reject({message: 'Params invalid'});
      }
    })
    .then(_createUser)
    .then(_generateToken)
    .then(token => {
      console.log('SENDING TOKEN');
      console.log(token);
      res.send({token: token});
    })
    .catch(error => {
      console.log('CATCH ERROR');
      res.status(422).send(error);
    });
}
  

Вот тестовый раздел:

 it ('Returns token when data is valid', done => {
  fetch(`http://localhost:${testPort}/api/register`, {
    headers: {'Content-Type': 'application/json'},
    method: 'POST',
    body: JSON.stringify({email: 'test@test.com', password: 'password', confirmPassword: 'password'})
  })
    .then(response => {
      assert(response.ok); // this part works ok
      expect(response.body.token).to.exist; // this part fails
      done();
    })
    .catch(done);
});
  

Вот вывод httpie:

 kpr$ http post localhost:4000/api/register email="rest@test.com" password="password" confirmPassword="password"
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 941
Content-Type: application/json; charset=utf-8
Date: Sat, 08 Oct 2016 11:39:30 GMT
ETag: W/"3ad-uBdW HLbY7L2gb65Y zptQ"
X-Powered-By: Express

{
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9_long_token_string_2M"
}
  

Вот тестовый результат:

 REGISTRATION VALID
_createUser
(node:70495) DeprecationWarning: Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead: http://mongoosejs.com/docs/promises.html
_generateToken
SENDING TOKEN
eyJhbGciOiJIU_long_token_string_lmYA

  0 passing (160ms)
  2 pending
  1 failing

  1) Authorization Registration Returns token when data is valid:
     AssertionError: expected undefined to exist
      at fetch.then.response (test/auth-controller-spec.js:57:41)
      at process._tickCallback (internal/process/next_tick.js:103:7)
  

Распечатка тела ответа из fetch () показывает какой-то огромный объект:

 PassThrough {
  _readableState:
   ReadableState {etc...}
}
  

Комментарии:

1. Можете ли вы попробовать response.json() вместо response.ok ??

2. response.json() возвращает обещание { <ожидание> }

3. Хорошо, я думаю, это то, что мне было нужно: response.json().then() возвращает то, что мне было нужно. Большое спасибо, Дэвид!

Ответ №1:

Вам нужно попробовать response.json() вместо response.ok того, что вернет ответ надлежащим образом в вашем случае.

Надеюсь, это поможет!