当验证失败时,Mongoose会发送现有文档

时间:2017-08-15 04:18:49

标签: node.js mongodb validation express mongoose

我有一个POST请求来创建文档。我的问题是,当验证失败时,mongoose将原始文档设置为响应的一部分。我想让mongoose不发送现有文件,主要是哈希密码。

这是回复

{
"code": 11000,
"index": 0,
"errmsg": "E11000 duplicate key error collection: ole.tournament index: name_1 dup key: { : \"First tournament\" }",
"op": {
    "name": "First tournament",
    "tournType": "single elimination",
    "seriesType": "bo1",
    "password": "$2a$10$xhA5UkpK.xH4QROdHf/Os.djs9CcU3C8PPcM8j99RocYPHS3x0tIC",
    "_creator": "5992734ebaa773270898e248",
    "_id": "59927361baa773270898e24a",
    "participants": [],
    "startedDate": null,
    "createdDate": "2017-08-15T04:06:57.640Z",
    "__v": 0
}
}

这是我添加的一些代码,因此mongoose不会发送密码,但它仅在创建或更新文档时有效,但在路径验证失败时则无效:

TournamentSchema.methods.toJSON = function(){
  var tournament = this;
  var tournamentObject = tournament.toObject();
  return _.omit(tournamentObject, "password");
}

这是我的路线

.post('/add', authenticate, (req, res) => {
  req.body._creator = req.user._id;
  tournament = new Tournament(req.body);
  tournament.save().then((tournDoc) =>{
    res.status(200).send(tournDoc);
  }).catch((e) => {
    res.status(400).send(e);
  })
})

我知道解决这个问题的一个快速方法是在catch块中省略它,但有没有一种猫鼬方法可以做到这一点?

感谢。

1 个答案:

答案 0 :(得分:0)

您只需要向客户端发回errmsg即错误消息。将完整错误对象发送到客户端不是一个好习惯。您可以查看以下代码:

.post('/add', authenticate, (req, res) => {
   req.body._creator = req.user._id;
   tournament = new Tournament(req.body);
   tournament.save().then((tournDoc) =>{
      res.status(200).send(tournDoc);
   }).catch((e) => {
      res.status(400).send(e.errmsg);
   })
}) 

或者您甚至可以向客户端发送自定义错误消息,如下所示:

.post('/add', authenticate, (req, res) => {
   req.body._creator = req.user._id;
   tournament = new Tournament(req.body);
   tournament.save().then((tournDoc) =>{
      res.status(200).send(tournDoc);
   }).catch((e) => {
      if(e.code == 11000) {
         res.status(409).send("Validation failed!!");
      }
      res.status(500).send("Error occurred!! Please try again.");
   })
})