2

Express.js でフォームを使用してアプリケーションを作成しています。まず、ルート (または必要に応じてコントローラー) ですべての検証を行っていました。

app.post('/register', function (req, res, next) {
  // Generic validation
  req.assert('name', 'Name is empty').notEmpty();
  req.assert('username', 'Username is empty').notEmpty();
  var errors = req.validationErrors(true);
  if (errors) {
    // If there are errors, show them
  } else {
    // If there are no errors, use the model to save to the database
  }
});

しかし、「シン コントローラー、ファット モデル」の原則に沿って、モデル内で検証を行う必要があることをすぐに知りました。

モデル:

var userSchema = new Schema({
    name: {
      type: String
    , required: true
    , validate: [validators.notEmpty, 'Name is empty']
    }
  , username: {
      type: String
    , required: true
    , validate: [validators.notEmpty, 'Username is empty']
    }
 , salt: String
 , hash: String
});

ルート/コントローラー:

app.post('/register', function (req, res, next) {
  var newUser = new User(req.body);
  // Tell the model to try to save the data to the database
  newUser.save(function (err) {
    if (err) {
      // There were validation errors
    } else {
      // No errors
    }
  });
});

これはうまくいきます。ただし、データベース層の前に検証を行う必要があります。たとえば、2 つのパスワードが同じ(passwordconfirmPassword) かどうかを確認する必要があります。これはスキーマで定義できません。モデルにsalt保存するだけなので。hashしたがって、ルート/コントローラーで、データベース層の前にこの検証を行う必要があります。このため、検証メッセージを一緒に表示することはできません。

これは、データベース層のモデルとコントローラーで検証するのが最善の方法ですか? 以前のように、すべての検証をコントローラーで行う方が良いですか? しかし、その後、モデルに再度保存するコードを繰り返します。または、別のパターンを使用する必要があります。

4

1 に答える 1