Express return res.send get错误:发送标头后无法设置

时间:2019-05-04 16:41:14

标签: node.js express

我搜索了两次由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 :(得分:0)

我看到在您的代码中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 }