sql >> データベース >  >> NoSQL >> MongoDB

マングース検証エラーの処理–どこでどのように?

    この時点で、マングースがエラーを処理する方法に賛成するのは理にかなっているようです。

    モデルがエラーメッセージを処理することは望ましくありません。プレゼンテーション層(コントローラー?)はtypeに依存する必要があります 表示するのに最適なユーザーフレンドリーなメッセージを決定します(i18nを考慮)。

    ミドルウェアを使用して検証が行われる場合もあります。この場合、コントローラーに表示されるエラーメッセージは、next()に渡すものです。 コールバック。

    したがって、ミドルウェアの場合、文書化されていませんが、モデル全体で一貫した検証APIを維持するには、Mongooseのエラーコンストラクターを直接使用する必要があります。

    var mongoose = require('mongoose');
    var ValidationError = mongoose.Error.ValidationError;
    var ValidatorError  = mongoose.Error.ValidatorError;
    
    schema.pre('save', function (next) {
      if (/someregex/i.test(this.email)) {
        var error = new ValidationError(this);
        error.errors.email = new ValidatorError('email', 'Email is not valid', 'notvalid', this.email);
        return next(error);
      }
    
      next();
    });
    

    そうすれば、検証エラーがミドルウェアに起因する場合でも、一貫した検証エラー処理が保証されます。

    エラーメッセージをタイプに適切に一致させるために、列挙型を作成します これは、考えられるすべてのタイプの静的マップとして機能します:

    // my controller.js
    
    var ValidationErrors = {
      REQUIRED: 'required',
      NOTVALID: 'notvalid',
      /* ... */
    };
    
    
    app.post('/register', function(req, res){
      var user = new userModel.Model(req.body);
    
      user.save(function(err){
        if (err) {
          var errMessage = '';
    
          // go through all the errors...
          for (var errName in err.errors) {
            switch(err.errors[errName].type) {
              case ValidationErrors.REQUIRED:
                errMessage = i18n('Field is required');
                break;
              case ValidationErrors.NOTVALID:
                errMessage = i18n('Field is not valid');
                break;
            }
          }
          res.send(errMessage);
    
        }
      });
    });
    


    1. 小さな.NETアプリケーションに適したデータベースは何ですか?

    2. Redis:NOAUTH認証が必要ですが、パスワード設定はありません

    3. Dockerのnode.js経由でMongoDBに接続できません

    4. アプリとウェブページ間のリアルタイム通信