Цикл запроса-ответа Express-Mongoose / обработка ошибок с помощью exp - PullRequest
0 голосов
/ 16 марта 2019

У меня сложилось впечатление, что res.send () завершает цикл запрос-ответ, но без return в блоке else вызывается next(ex), который передает объект ответа промежуточному программному обеспечению для обработки ошибок, в результате чего Error: Can't set headers after they are sent.

Где моё понимание? Я использую express-async-errors, чтобы ловить ошибки, если это важно.

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 {
    return res.status(200).send(allStaff);
  }
  next(ex);
});

1 Ответ

1 голос
/ 16 марта 2019

В своем вопросе вы сами упоминаете, что функция 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
            }
        }
    });


});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...