В своем вопросе вы сами упоминаете, что функция next () передает объект ответа промежуточному программному обеспечению для обработки ошибок, поэтому следующее промежуточное программное обеспечение будет выполняться, даже если вы этого не хотите, то есть allstaff будет успешно отправлен, но затемБудет вызвана функция next ().
Что вы делаете (без возврата в блоке else):
Отправка объекта allstaff и, следовательно, попытка завершить запросцикл ответа, но затем вызывается next (), следовательно, вызывается следующее промежуточное ПО, которое пытается запутаться в том, что в противном случае было бы успешным циклом ответа на запрос.
router.get('/', async (req, res, next) => {
// get all staff sorted by name
const allStaff = await Staff.find().sort('name');
if (!allStaff) {
res.status(404).send('No staff');
} else {
res.status(200).send(allStaff); //send the response..expect the req-res cycle to end
}
next(ex); //then call next which might try to hamper the outgoing response
});
Что вы должны сделать вместо этого:
Если вы отправляете ответ, то он никоим образом не должен сталкиваться с другим оператором, который пытается отправить ответ снова, я предпочитаю следующий код:
router.get('/', (req, res, next) => {
// get all staff sorted by name
Staff.find().sort('name').exec(function (err, docs) { //this callback function will handle results
if (err) {
next(); //if there is an error..then the next middleware will end the req response cycle
} else {
if (docs.length == 0) {
res.status(404).send('No staff'); //send response,the req- res cycle ends,never disturbed again...story finished
} else {
res.status(200).send(docs); //send response,the req- res cycle ends,never disturbed again.....story finished
}
}
});
});