Экспресс возврат res.send get Ошибка: не удается установить заголовки после их отправки - PullRequest
0 голосов
/ 04 мая 2019

Я искал эту ошибку, вызванную res.send дважды. Решение должно использовать return res.send.

Но это не работает для меня.

Вот мой код:

function editFoo(req, res) {
  ErrorResponse.checkError422(req, res)
  console.log("shouldn't print")
  Foo.findAndUpdate({_id:req.params.activityId}, {$set:{title:req.body.title}}, {new: true}, function(err, activity) {
        return res.send({code: 0, newTitle: activity.title, message: "Edit successfully"})
    })
}

ErrorResponse.js

function checkError422(req, res) {
  const errors = validationResult(req)

  if (!errors.isEmpty()) {
    return res.status(422).send({error: "xxx"})
  }
}

module.exports = { checkError422 }

Тогда я получил ошибку:

Error: Can't set headers after they are sent.

и shouldn't print напечатано.

Но если я заменил ErrorResponse.checkError422(req, res) на код ошибки проверки напрямую,

function editFoo(req, res) {
      const errors = validationResult(req)

      if (!errors.isEmpty()) {
        return res.status(422).send({error: "xxx"})
      }
      console.log("shouldn't print")
      Foo.findAndUpdate({_id:req.params.activityId}, {$set:{title:req.body.title}}, {new: true}, function(err, activity) {
            return res.send({code: 0, newTitle: activity.title, message: "Edit successfully"})
        })
    }

хорошо работает и не печатает "shouldn't print"

Не уверен, что здесь не так. Я хочу использовать функцию checkError422 для замены многих проверок. я думаю return res.status(422).send({error: "xxx"}) должен выйти из этого editFoo.

Почему? Спасибо за помощь.

1 Ответ

0 голосов
/ 04 мая 2019

Я вижу, что в вашем коде checkError422 может res по-прежнему отправлять ответ ... поэтому Вы должны сделать обратное ...

  // checkError422
  if (!errors.isEmpty()) {
    return res.status(422).send({error: "xxx"})
  }

Итак:

function editFoo(req, res) {
      const errors = validationResult(req)

      if (errors.isEmpty()) {
           console.log("shouldn't print")
           Foo.findAndUpdate({_id:req.params.activityId}, {$set:{title:req.body.title}}, {new: true}, function(err, activity) {
                return res.send({code: 0, newTitle: activity.title, message: "Edit successfully"})
           })
      }
    }

Обновление

Ваш код является избыточным, поэтому вам просто нужно сделать:

function checkError422(req, res) {
  return validationResult(req)
}

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