2016-10-08 9 views
0

Ich schreibe Komponententests für eine einfache NodeJS-Anwendung und aus irgendeinem Grund kann ich Antwortkörper nicht abrufen. Es erhält den richtigen Antwortcode (entweder 200 für erfolgreiche Anfragen oder 422 für ungültige Anfragen), aber der Körper scheint leer zu sein. Auch, wenn ich genau die gleiche Anfrage mit httpie mache es funktioniert wie Charme. Die Protokollierung zeigt auch, dass der Controller wie erwartet funktioniert.Node-Fetch empfängt leeren Körper

Alle Ideen oder Vorschläge sind willkommen.

Hier ist der Controller Teil:

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

Hier ist der Teststrecke:

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: '[email protected]', 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); 
}); 

Hier ist die httpie Ausgabe:

kpr$ http post localhost:4000/api/register email="[email protected]" 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" 
} 

Hier ist der Testausgang:

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) 

Druck aus Antwort Körper von innen fetch() zeigt einige große Objekt:

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

Können Sie 'response.json()' anstelle von 'response.ok' versuchen? –

+0

response.json() gibt _Promise {} _ – Konstantin

+0

zurück Ok, ich denke, das ist was ich brauchte: _response.json(). Dann() _ gibt zurück, was ich brauchte. Vielen Dank, David! – Konstantin

Antwort

1

Sie müssen response.json() statt response.ok, um zu versuchen, die die Rückkehr wird in Ihrem Fall richtig reagieren.

Hoffe, das hilft!

Verwandte Themen