2017-06-06 10 views
1

私はnode.js apiをビルドしており、エラーに関するメッセージだけをコールバックに渡したいと考えています。今私はここに私のコードは userModel.js私は「メッセージを検索フロントエンドに機能させることができます。もちろん、モデルからコントローラ(Mongoose)へのエラーメッセージのみを渡す方法は?

/* 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}.`}); 
     }); 
    }; 

あるこの

{ 
    "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" 
    } 
} 

のようなオブジェクトとの契約を持っている必要がありますいくつかのレコードで100を超えるエラーが発生する可能性があります。とにかく私はそれをやり遂げることができ、冗長データを渡さないのですか?

答えて

1

あなたは可能性をテストしていません

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

ような何かを

オブジェクト作るために.lean()を使用することができますフロントエンドに送る前にエラーオブジェクトを解析するだけです。

ここではループを使ってどのようにすることができますか。

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')

2番目のパラメータは、私はあなたにも_idを除外するUser.find({},'messages -_id')を行うことができると思いますが、あなたがあなたのオブジェクトを使用している場合は、投影mongoose api

ですできます{_id : 0}

あなたは、エラーメッセージでオブジェクトをフィルタリングする場合:

あなたは本当のjsが

+0

実際に保存から返されたエラーで投影を使用できますか? – user3220633

+0

バックエンドのドキュメントをフィルタリングすることについて編集しました –

+0

@jackblankは返信してくれてありがとうございます。このようなことをしますか?//新しいユーザを登録する exports.signup =(req、res)=> { new_user = new User(req.body); IF(ERR){ User.find({})。リーン() .then(new_user => { new_user.filter(E => E new_user.save((ERR、new_user)=> { } }); 返信res.json(成功:false、msg:err)); } else res.json({成功:true、msg: '新しいユーザー$を作成しました。 {new_user.username}。 '}); }); }; 'これまでのところ動作させることはできません – user3315525

関連する問題