2017-06-06 45 views
1

我正在构建我的node.js api,并希望仅传递有关错误的回调消息。现在,我需要有一个处理这样如何仅将错误消息从模型传递给控制器​​(Mongoose)?

{ 
    "success": false, 
    "msg": { 
     "errors": { 
      "email": { 
       "message": "[email protected] is not a valid email!", 
       "name": "ValidatorError", 
       "properties": { 
        "type": "user defined", 
        "message": "{VALUE} is not a valid email!", 
        "path": "email", 
        "value": "[email protected]" 
       }, 
       "kind": "user defined", 
       "path": "email", 
       "value": "[email protected]" 
      }, 
      "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 /^(([^<>()\[\]\.,;:\[email protected]\"]+(\.[^<>()\[\]\.,;:\[email protected]\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\[email protected]\"]+\.)+[^<>()[\]\.,;:\[email protected]\"]{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}.`}); 
     }); 
    }; 

我当然可以上搜索“消息的前端功能'键,但对于一些记录,它可能超过100个错误。无论如何,我是如何做到这一点的,而且不会传递冗余数据?

回答

1

你可以只需在将错误对象发送到前端之前解析它即可。

下面是如何使用循环做到这一点。

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}); 
} 
+0

感谢您的答复,但我试图避免解析对象。在这种情况下, – user3315525

+0

看起来是最好的解决方案 – user3315525

0

预测

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

User.find({},'messages')

第二个参数是投影mongoose api

我想你也可以做User.find({},'messages -_id')离开了_id,但如果你正在使用的对象,你可以做{_id : 0}

如果你想与错误信息过滤掉对象:

你可以使用.lean()做一个真正的JS对象

这样做

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

没有测试

+0

你真的可以使用投影与保存返回的错误吗? – user3220633

+0

我对后端文档进行了过滤编辑 –

+0

@jackblank感谢您的回复。你的意思是做这样的事情吗?//注册新用户 exports.signup =(req,res)=> {let} new_user = new User(req.body); new_user.save((ERR,new_user)=> { 如果(ERR){ User.find({})。瘦() 。然后(new_user => { new_user.filter(E =>电子.name ==“ValidationError”) }); return res.json({success:false,msg:err}); } else res.json({success:true,msg:'Successful created new user $ {new_user.username}。'}); }); };'不能使它的工作到目前为止 – user3315525

相关问题