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 つのパスワードが同じ(password
とconfirmPassword
) かどうかを確認する必要があります。これはスキーマで定義できません。モデルにsalt
保存するだけなので。hash
したがって、ルート/コントローラーで、データベース層の前にこの検証を行う必要があります。このため、検証メッセージを一緒に表示することはできません。
これは、データベース層のモデルとコントローラーで検証するのが最善の方法ですか? 以前のように、すべての検証をコントローラーで行う方が良いですか? しかし、その後、モデルに再度保存するコードを繰り返します。または、別のパターンを使用する必要があります。