7

次のカスタム バリデータ関数を定義したとします。

isUnique: function () { // This works as expected
  throw new Error({error:[{message:'Email address already in use!'}]});
}

ただし、DB にクエリを実行しようとすると、次のような問題が発生します。

isUnique: function (email) { // This doesn't work
  var User = seqeulize.import('/path/to/user/model');

  User.find({where:{email: email}})
    .success(function () { // This gets called
      throw new Error({error:[{message:'Email address already in use!'}]});  // But this isn't triggering a validation error.
    });
}

カスタムバリデーターで ORM を照会し、ORM からの応答に基づいて検証エラーをトリガーするにはどうすればよいですか?

4

5 に答える 5

11

Sequelize 2.0 では、検証エラーをキャッチする必要があります。

まず、カスタム バリデータを使用してユーザー モデルを定義します。

var User = sequelize.define('User',
    {
        email: {
            type: Sequelize.STRING,
            allowNull: false,
            unique: true,
            validate: {
                isUnique: function (value, next) {
                    var self = this;
                    User.find({where: {email: value}})
                        .then(function (user) {
                            // reject if a different user wants to use the same email
                            if (user && self.id !== user.id) {
                                return next('Email already in use!');
                            }
                            return next();
                        })
                        .catch(function (err) {
                            return next(err);
                        });
                }
            }
        },
        other_field: Sequelize.STRING
    });

module.exports = User;

次に、コントローラーで、検証エラーをキャッチします。

var Sequelize = require('sequelize'),
    _ = require('lodash'),
    User = require('./path/to/User.model');

exports.create = function (req, res) {
    var allowedKeys = ['email', 'other_field'];
    var attributes = _.pick(req.body, allowedKeys);
    User.create(attributes)
        .then(function (user) {
            res.json(user);
        })
        .catch(Sequelize.ValidationError, function (err) {
            // respond with validation errors
            return res.status(422).send(err.errors);
        })
        .catch(function (err) {
            // every other error
            return res.status(400).send({
                message: err.message
            });
        });
于 2014-11-28T10:17:39.727 に答える
4

ユーザーが見つからない場合でも、成功のコールバックが呼び出されます。関数がユーザーを引数として渡すかどうかを確認する必要があります。

isUnique: function (email) {
  var User = seqeulize.import('/path/to/user/model');

  User.find({where:{email: email}})
    .success(function (u) { // This gets called
      if(u){
        throw new Error({error:[{message:'Email address already in use!'}]});  // But this isn't triggering a validation error.
      }
    });
}
于 2013-09-19T20:46:35.937 に答える