我有一个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块中省略它,但有没有一种猫鼬方法可以做到这一点?
感谢。
答案 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.");
})
})