2016-07-19 29 views
2

Ich erhalte inkonsistente Ergebnisse von meinem Server. Manchmal ist die richtige Antwort wird gesendet, und manchmal bekomme ich die FehlerKann Header nicht entfernen, nachdem sie gesendet werden

kann nicht Header entfernen, nachdem sie

Mit Node.js, Koa.js und Mongoose

router 
.get('/events/', function* getEvent() { 
    let eventList = []; 
    yield Event.find({}, (error, events) => { 
    if (error) { 
     this.response.body = 'Unable to get events.'; 
     this.status = 404; 
     return; 
    } 

    eventList = events; 
    eventList.sort((first, second) => { 
     // sort implementation 
    }); 

    this.response.body = eventList; 
    this.status = 200; 
    }); 
}); 
+1

Dies wird normalerweise durch einen inkonsistenten res.end() - Aufruf verursacht. Wenn das nicht der Fall ist, könnten Sie etwas mehr Kontext oder Code bereitstellen? – Dreamlines

+0

Editierter Codeblock, um die gesamte Methode anzuzeigen. Mir ist aufgefallen, dass der Endanruf manchmal nicht konsistent ist. Manchmal wird die Event.find() ausgeführt, manchmal nicht. – safaiyeh

+1

Es besteht die Möglichkeit, dass dies daran liegt, wie Sie mit Fehlern umgehen (können Sie den Code auch hinzufügen?). Es scheint auch, dass Ihre 'Ausbeute' überflüssig ist, da Sie auch einen Callback an' Event.find() 'übergeben. – robertklep

Antwort

1

Das Problem wird durch Ihren Rückruf verursacht, der eine Wettlaufsituation einführt, da Ihr Ertrag nicht darauf wartet, dass er beendet wird. In Koa v1.x verwenden Sie in der Regel nur eine Callback-API, um ein Versprechen zurückzugeben.

Hier ist, wie Sie Ihr Beispiel mit Koa v1.x schreiben würde:

router 
    .get('/events', function *() { 
    let events 
    try { 
     events = yield Event.find({}) 
    } catch (err) { 
     this.status = 503 
     this.body = 'Unable to get events' 
     return 
    } 
    events = sort(events) 
    this.body = events // Implicit 200 response 
    }) 

Event.find braucht nur etwas nachgebenden wie ein Versprechen zurückzukehren. Überprüfen Sie, ob die Bibliothek, die Sie verwenden, über eine Version verfügt, die das Versprechen erfüllt.

Obwohl normalerweise würde man es einfach so schreiben:

router 
    .get('/events', function *() { 
    let events = yield Event.find({}) 
    events = sort(events) 
    this.body = events 
    }) 

Da es ein interner Fehler (500 response), wenn Event.find nach unten. Koa wird nicht erfasste Fehler in 500 Antworten verwandeln.

1
gesendet werden

Grundsätzlich, nachdem Sie this.status auf 200 gesetzt haben, löst es einen Fehler aus, da this.response.body wahrscheinlich undefined. Gehen Sie voran und console.log() this.response.body und sehen Sie, ob es definiert ist. Wenn es undefined ist, würde ich vermuten, req.body wird nicht korrekt ausgefüllt, oder es ist ein asynchrones Knotenproblem. Grundsätzlich wird eventList.sort() asynchron ausgeführt, da this.response.body = eventList gesetzt ist. Daher ist eventList beim Einstellen noch nicht sortiert. Um dies zu beheben, setzen Sie es in den eventList.sort() Callback.

EDIT: nachdem ich Ihren Kommentar gesehen habe, bin ich ziemlich sicher, dass es asynchrones Problem jetzt ist. Lassen Sie mich wissen, ob die letzten zwei Zeilen innerhalb des Sortieraufrufs für Sie funktionieren.

+0

Die Zeile wurde hinzugefügt, um den Sortieraufruf zu stoppen, das Problem besteht jedoch weiterhin. – safaiyeh

+0

Bitte lassen Sie mich wissen, was in console.log in this.response ist.Körper – gcoreb

+0

Es ist mir gerade aufgefallen: Sie könnten this.request.body, nicht this.response.body – gcoreb