Estoy tratando de encontrar un error en mi código, y no encaja nada de otros temas.
Hay código app.js, que contiene el método get del módulo Express:
app.get('/notes', notesController.all); Hay código notesController.js, que se exporta al método de create app.js:
exports.all = function (req, res) { Notes.all(function(err, docs){ if(err){ console.log(err); return res.sendStatus(500); } res.send(docs); }) }; En model este código:
exports.all = function (cb) { db.get().collection('notes').find().toArray(function (err, docs) { cb(err,docs); }) };La aplicación falla con este error:
process.nextTick(function() { throw err; }); ^Error: no se pueden establecer encabezados después de enviarlos. en ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:357:11) en ServerResponse.header (O:\OGPI6\node_modules\express\lib\response.js:725:10) en ServerResponse.json (O:\OGPI6\node_modules \express\lib\response.js:253:10) en ServerResponse.send (O:\OGPI6\node_modules\express\lib\response.js:158:21) en O:\OGPI6\controllers\notes.js:9 :13 en O:\OGPI6\models\notes.js:6:9 en handleCallback (O:\OGPI6\node_modules\mongodb\lib\utils.js:120:56) en O:\OGPI6\node_modules\mongodb\lib \cursor.js:860:16 en handleCallback (O:\OGPI6\node_modules\mongodb-core\lib\cursor.js:171:5) en setCursorDeadAndNotified (O:\OGPI6\node_modules\mongodb-core\lib\cursor. js:505:3)
En mi opinión, solo hay un error con "controlador" en la función de devolución de llamada:
if(err){ console.log(err); return res.sendStatus(500); } res.send(docs); Pero pensé que cuando ocurre un error, debe terminar la función y devolver sendStatus(500) , pero después de registrar un error en la consola, intenta devolver res.send(docs) y luego la aplicación falla porque está enviando el segundo encabezado. Se ve bien pero no funciona. ¿Alguien puede señalar de qué manera he fallado?
Utilice el parámetro "siguiente" en el middleware para que Express sepa que el propósito de este middleware se ha completado y que ya no es necesario ejecutar el código.
exports.all = function (req, res, next) { Notes.all(function(err, docs){ if(err){ console.log(err); res.sendStatus(500); return next(); } res.send(docs); }) };La ejecución del código después de la devolución puede deberse a la naturaleza asíncrona.
También puede usar el bloque else.
exports.all = function (req, res, next) { Notes.all(function(err, docs){ if(err){ console.log(err); res.sendStatus(500); } else res.send(docs); }) };Cambia el código a
if(err){ console.log(err); return res.status(500).send(err); } res.send(docs);