2015-07-24 4 views
1

Я разрабатываю проект, в котором администраторы могут добавлять чаты, и у них есть пять полей: (id, creator (администратор, который его создал), имя, slug и createdAt), и я получаю эту ошибку Unhandled rejection SequelizeValidationError: notNull Нарушение: имя не может быть 0:.Нарушение проверки достоверности

//models/user.js 
var Sequelize    = require('sequelize'); 
var passportLocalSequelize = require('passport-local-sequelize'); 
var env      = process.env.NODE_ENV || 'development'; 
var config     = require(__dirname + '/../config/config.json')[env]; 

var mydb = new Sequelize(config.database, config.username, config.password, config); 

// We do not need additional features for our users, so we just use the default user model 
// provided by Passport 
var User = passportLocalSequelize.defineUser(mydb, 
    { 
     email: { type: Sequelize.STRING, allowNull: false, unique: true } 
    },{} 
); 

//Function at a prototype level for performance optimization 
User.Instance.prototype.$Model.findByEmail = function(email, done){ 
    var parameters = {}; 
    parameters.email = email; 
    var user = this.findOne({where: parameters}); 
    user.then(function(usr) { 
     done(null, usr); 
    }); 
} 

mydb.authenticate().then(function(done) 
{ 
    if(mydb.sync({force: false})) 
    done(); 
}).catch(function(error,user) 
{ 
     console.log(error); 
}); 

module.exports = User; 

//models/chat.js 
var Sequelize = require('sequelize'); 
var env  = process.env.NODE_ENV || 'development'; 
var config = require(__dirname + '/../config/config.json')[env]; 
var User  = require('./user'); 

var mydb = new Sequelize(config.database, config.username, config.password, config); 

var Chat = mydb.define('Chat', 
{ 
    id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true }, 
    name: { type: Sequelize.STRING, unique: true, allowNull: false, 
     validate: { 
      notNull: { args: true, msg: "You must enter a name" } 
     }, 
     set: function(val) { 
      val = val.toLowerCase().trim(); 
      this.setDataValue('title', val); 
      this.setDataValue('slug', val.split(" ").join("_")); 
     } 
    }, 
    slug: { type: Sequelize.STRING, unique: true, allowNull: false }, 
    creator: { type: Sequelize.INTEGER, references: { model: User, key: 'id' }} 
}, 
{ 
    timestamps: true, 
    updatedAt: false // I only want the field createdAt 
} 
) 

mydb.authenticate().then(function(done){ 
    if(mydb.sync({force: false})) 
     done() 
}).catch(function(err, chat){ 
    console.log(err); 
}); 

module.exports = Chat; 


//routes/admin.js 
router.post("/dashboard",isAuthenticated, function(req,res){ 
    if (req.body.chatName) { 
     try{ 
      console.log(req.body.chatName); 
      console.log(Chat.create({ name: req.body.chatName, creator: req.user.id })); 
     } 
     catch (e){ 
      console.log(e.message); 
     } 

    } 
}); 

Я только скопировать и вставить функцию, которая управляет созданием чатов console.log (req.body.chatName); печатает правильно введенное имя

ответ

1

Из sequelize документы:

// setting allowNull to false will add NOT NULL to the column, which means an error will be 
// thrown from the DB when the query is executed if the column is null 

В вашей таблице чата вы установите

name: { type: Sequelize.STRING, unique: true, allowNull: false, 
    validate: { 
     notNull: { args: true, msg: "You must enter a name" } 
    }, 
    set: function(val) { 
     val = val.toLowerCase().trim(); 
     this.setDataValue('title', val); 
     this.setDataValue('slug', val.split(" ").join("_")); 
    } 
}, 

для поля пользователя, где AllowNull ложно.

Таким образом, ошибка, которую вы получаете, находится непосредственно из db вместо вашего сообщения в свойстве validate. Избавьтесь от свойства allowNull, сохраните проверку, и вы должны быть хорошими. Немного поздно, но надеюсь, что это прояснит ситуацию!

Смежные вопросы