2016-03-30 3 views
1

Wir sind derzeit mit einer Uncaught Error: Can't set headers after they are sent. Fehlermeldung beim Versuch, eine Benutzeranmeldung in einen Test mit Chai-HTTP verketten .Kann Header nicht festlegen, nachdem sie gesendet werden Fehler beim Versuch, Benutzersitzung für einen Test mit Chai-Anfrage-Agent

Der Test meldet sich als Benutzer an, der bereits in der Datenbank über unsere API vorhanden ist und dann versuchen soll, alle Elemente aus einer vorhandenen Route abzurufen. Unser aktueller Test ist unterhalb, der das Beispiel, das in der Chai-HTTP-Dokumentation http://chaijs.com/plugins/chai-http/#retaining-cookies-with-each-request angegeben ist, sehr genau widerspiegelt.

it('should return all notes on /api/notes GET', function (done) { 
agent 
    .post('/users/register') 
    .send(user) 
    .then(function() { 
    return agent 
     .get('/api/notes') 
     .end(function (err, res) { 
     // expectations 
     done(); 
     }); 
    }); 
}); 

Unser Stack-Trace

Uncaught Error: Can't set headers after they are sent. 
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:346:11) 
    at ServerResponse.header (node_modules/express/lib/response.js:718:10) 
    at ServerResponse.send (node_modules/express/lib/response.js:163:12) 
    at ServerResponse.json (node_modules/express/lib/response.js:249:15) 
    at app/routes/usersRouter.js:16:29 
    at node_modules/passport/lib/middleware/authenticate.js:236:29 
    at node_modules/passport/lib/http/request.js:51:48 
    at pass (node_modules/passport/lib/authenticator.js:287:14) 
    at Authenticator.serializeUser (node_modules/passport/lib/authenticator.js:289:5) 
    at IncomingMessage.req.login.req.logIn (node_modules/passport/lib/http/request.js:50:29) 
    at Strategy.strategy.success (node_modules/passport/lib/middleware/authenticate.js:235:13) 
    at verified (node_modules/passport-local/lib/strategy.js:83:10) 
    at InternalFieldObject.ondone (node_modules/passport-local-mongoose/lib/passport-local-mongoose.js:149:24) 

Dies ist die, die den Fehler zu sein scheinen auf unserem Benutzer Router-Funktion aufgerufen wird erhöht (nicht manuell angehoben, nur ausgelöst, wenn chai mit)

router.post('/register', function(req, res) { 
User.register(new User({ username : req.body.username }), req.body.password, function(err, user) { 
    if (err) { 
     res.status(500).json({info: err}); 
    } 

    passport.authenticate('local')(req, res, function() { 
     res.status(200).json({info: "success"}); 
    }); 
}); 
}); 

Manuelles Testen dieser Funktionalität funktioniert einwandfrei, das Problem scheint lediglich auf unseren Test und seine Interaktion mit dem Pass zurückzuführen zu sein.

Hat jemand irgendwelche Vorschläge oder Hinweise, die hilfreich sein könnten?

+0

Haben Sie versucht, 'return;' unmittelbar nach 'res.status (500) .json ({info: err});'? Welche Zeile ist Zeile 16 in Ihrem 'usersRouter.js'? – mscdex

+0

Zeile 16 jetzt, nachdem Ihre vorgeschlagene Änderung lautet: 'return res.json ({'ERROR': err});', jedoch immer noch den gleichen Fehler zurück. –

+0

Warum verwenden Sie Ende anstelle von dann? In Ihrem Beispiel mischen Sie Versprechen mit klassischen Rückrufen, vielleicht sollten Sie versuchen, es zu ändern? –

Antwort

0

Wird im User.register-Callback ein Err-Objekt übergeben? Wenn ja, versuchen Sie, return res.status(500).json({info: err}); so zu setzen, dass der Passcode nicht ausgeführt wird. Das return wird die Funktion beenden und nicht versuchen, die Header zweimal festzulegen.

0

Dies alles kommt auf zwei verschiedene Teile des Codes zurück, die beide die Anfrage beantworten (res.send oder res.json).

Im Wesentlichen gibt es zwei Möglichkeiten: 1. Passport verwendet das Res-Objekt, um die Anfrage zu beantworten, bevor Sie es tun. Überprüfen Sie die Dokumentation, wie dies geschehen soll. 2. Sie erhalten einen Fehler, und da Sie einen Fehler mit einer fehlenden Rückgabe in der Fehlerbehandlungsroutine haben, wird das Res-Objekt zweimal festgelegt.

-1

Dies ist eine späte Antwort, aber ich hatte gerade dieses genaue Problem.

Haben Sie versucht, Ihre Funktion "pass.authenticate" in eine else-Anweisung einzufügen?

Ich habe festgestellt, dass dieses Problem für mich behoben.

+1

Dieser Beitrag ist kein tatsächlicher Versuch, die Frage zu beantworten. Bitte beachten Sie [StackOverflow funktioniert nicht wie ein Diskussionsforum] (http://stackoverflow.com/tour), es ist eine Q & A-Seite, wo jeder Beitrag entweder eine Frage oder eine Antwort auf eine Frage ist. Beiträge können auch [Kommentare] (http://stackoverflow.com/help/privileges/comment) - kleine Sätze wie diesen - haben, die verwendet werden können, um einen Autor zu kritisieren oder um Klärung zu bitten. Dies sollte entweder ein Kommentar oder eine [neue Frage] sein (http://stackoverflow.com/questions/ask) –