No se pueden eliminar los encabezados después de que se envían

Estoy obteniendo resultados inconsistentes de mi servidor. A veces se envía la respuesta correcta y otras veces me sale el error.

No se pueden eliminar los encabezados después de que se envían

Usando Node.js, Koa.js, y 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; }); }); 

El problema se debe a su callback que introduce una condición de carrera ya que su rendimiento no está esperando a que termine. En Koa v1.x, generalmente solo usas una API de callback para devolver una promesa.

Así es como escribirías tu ejemplo con Koa v1.x:

 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 solo necesita devolver algo que se pueda Event.find como una promesa. Verifique si la biblioteca que usa tiene una versión de promesa de devolución.

Aunque normalmente lo escribirías así:

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

Ya que es un error interno (500 respuestas) si Event.find está inactivo. Koa convertirá los errores no detectados en 500 respuestas.

Básicamente, después de establecer this.status en 200, se produce un error porque this.response.body probablemente undefined. esté undefined. Siga adelante y console.log() this.response.body y vea si está definido. Si no está undefined , supongo que req.body no se está req.body correctamente O es un problema de nodo asíncrono. Básicamente, eventList.sort () se ejecuta de forma asíncrona cuando se establece this.response.body = eventList. Por lo tanto, eventList no está ordenado aún cuando lo configuras. Para solucionarlo, póngalo dentro de la callback eventList.sort ().

EDITAR: después de ver su comentario, estoy bastante seguro de que ahora es un problema asíncrono. Avísame si poner las dos últimas líneas dentro de la llamada de ordenación te funciona.