如何只将错误消息从模型传递给控制器​​(Mongoose)?

我正在build立我的node.js api,并希望传递仅callback有关错误的消息。 现在我需要与这样的对象进行交易

{ "success": false, "msg": { "errors": { "email": { "message": "test@tes is not a valid email!", "name": "ValidatorError", "properties": { "type": "user defined", "message": "{VALUE} is not a valid email!", "path": "email", "value": "test@tes" }, "kind": "user defined", "path": "email", "value": "test@tes" }, "username": { "message": "The Username is not long enough", "name": "ValidatorError", "properties": { "type": "user defined", "message": "The Username is not long enough", "path": "username", "value": "te" }, "kind": "user defined", "path": "username", "value": "te" } }, "_message": "Users validation failed", "name": "ValidationError" } } 

这是我的代码userModel.js

 /* Custom Validation */ const validator = (v)=> { return v.length > 5; }; /* END of Custom Validation */ const UserSchema = new Schema({ username: { type: String, validate: [ validator, 'The Username is not long enough' ], required: [true, 'The Username is required'], unique: true, lowercase: true }, password: { type: String, required: [true, 'The Password is required'] }, email: { type: String, validate: [ (v)=> { return /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i.test(v)}, '{VALUE} is not a valid email!' ], lowercase: true, required: true }, role: { type: [{ type: String, enum: ['user', 'manager', 'admin'] }], default: ['user'] }, team: { type: [{ type: String, enum: ['IHLO', 'ADULT&SH', 'IPJ', 'ISD', ''] }], default: [''] }, created_date: { type: Date, default: Date.now }, }); UserSchema.pre('save', ... UserSchema.methods.comparePassword = ... module.exports = mongoose.model('Users', UserSchema); **userController.js** / Register new user exports.signup = (req, res)=> { let new_user = new User(req.body); new_user.save((err, new_user)=> { if (err) return res.json({success: false, msg: err}); res.json({success: true, msg: `Successful created new user ${new_user.username}.`}); }); }; 

当然,我可以在前端search“消息”键的function,但对于一些logging,可能会超过100个错误。 无论如何,我该怎么做,不要传递冗余数据?

在发送到前端之前,您可以简单地parsing错误对象。

以下是如何使用循环来完成的。

 if (err){ let messages = []; for(let i in err){ messages.push({ field: i, message: err[i].message }); } return res.json({success: false, msg: messages}); } 

你也可以使用像lodash这样的库来使它更清洁。

 if (err){ let messages = _.flatMap(err, (value, key) => { field: key, message: value.message }); return res.json({success: false, msg: messages}); } 

预测

User.find({}, {messages: 1})

User.find({},'messages')

第二个参数是投影mongoose api

我认为你也可以做User.find({},'messages -_id')来省略_id,但是如果你使用的是对象,你可以{_id : 0}

如果您想过滤掉带有错误消息的对象:

你可以使用.lean()来创build一个真正的js对象

做类似的事情

 User.find({}).lean() .then(users =>{ user.filter(e => e.name == "ValidationError") }) 

没有testing过