无法让Sequelize验证工作

时间:2013-06-22 16:48:33

标签: node.js sequelize.js

我正在尝试在我的Sequelize模型中实现验证。该模型定义如下

var model = sequelize.define('Model', {
  from: {
    type:               DataTypes.STRING,
    allowNull:          false,
    validate: {
      isEmail: true
    }
  }
}

然后我正在尝试构建一个实例并对其进行验证:

var m = Model.build({ from: 'obviously not a email' });
var err = m.validate();

但如果我console.log(err),我只会获得{ fct: [Function] }。定义抛出异常的自定义验证器会导致未处理的异常。

我应该如何正确使用validate()

3 个答案:

答案 0 :(得分:10)

以下是使用Sequelize v2.0.0

解决问题的方法
var Sequelize = require("sequelize")
  , sequelize = new Sequelize("sequelize_test", "root")

var Model = sequelize.define('Model', {
  from: {
    type:      Sequelize.STRING,
    allowNull: false,
    validate:  {
      isEmail: true
    }
  }
})

Model.sync().success(function() {
  Model.build({ from: "foo@bar" }).validate().success(function(errors) {
    console.log(errors)
  })
})

这将导致:

{ from: [ 'Invalid email' ] }

附注:您也可以跳过validate - 调用,只需创建实例:

Model.sync().success(function() {
  Model
    .create({ from: "foo@bar" })
    .success(function() {
      console.log('ok')
    })
    .error(function(errors) {
      console.log(errors)
    })
})

错误方法将收到与上一个代码段中完全相同的错误对象。

问候, sdepold。

答案 1 :(得分:5)

在Sequelize中验证的另一种方法是使用钩子而不是模型验证。我正在使用'beforeValidate'钩子并添加自定义验证(使用验证器模块)和Promises,验证失败时将被拒绝。

var validator = require('validator');

module.exports = function(sequelize, DataTypes) {
  var User = sequelize.define("User", {
    email: {
      type:DataTypes.STRING
    },
    password: {
      type:DataTypes.STRING
    }
  });
  //validate here
  User.hook('beforeValidate', function(user, options) {
    if(validator.isEmail(user.email)){
      return sequelize.Promise.resolve(user);
    }else{
      return sequelize.Promise.reject('Validation Error: invalid email');
    }
 });
 return User;
};

答案 2 :(得分:5)

这对我有用 在模型使用中: -

var model = sequelize.define('Model', {
  from: {
    type:               DataTypes.STRING,
    allowNull:          false,
    validate: {
      isEmail: true
    }
  }
}

在保存模型时,在控制逻辑中执行以下操作: -

var Sequelize = require('sequelize');
var Model = require('your_model_folderpath').model;

Model.create({from: 'not email'}).then(function(model) {
                    // if validation passes you will get saved model
            }).catch(Sequelize.ValidationError, function(err) {
                    // responds with validation errors
            }).catch(function(err) {
                    // every other error
            });