2015-12-26 106 views
0

我遇到了一个问题,那就是我试图在一个路由POST方法中为多个表填充值。我读与关联的文档创作的部分和模仿的例子,但我得到的一个问题:未关联的续集表问题

Error: organization is not associated to user! 
    at validateIncludedElement (/Users/user/Desktop/Projects/node/app/node_modules/sequelize/lib/model.js:560:11) 

我不知道为什么会这样,因为我使用的是.belongsTo方法应建立关联。

这里是user.js的模型:

var bcrypt = require('bcrypt-nodejs'); 

module.exports = function(sequelize, DataTypes) { 

var User = sequelize.define('user', { 
    user_id: { 
     type: DataTypes.INTEGER, 
     autoIncrement: true, 
     primaryKey: true 
    }, 
    organizationName: { 
     type: DataTypes.STRING, 
     field: 'organization_name', 
     unique: true 
    }, 
    firstName: { 
     type: DataTypes.STRING, 
     field: 'first_name' 
    }, 
    lastName: { 
     type: DataTypes.STRING, 
     field: 'last_name' 
    }, 
    email: { 
     type: DataTypes.STRING, 
     isEmail: true, 
     unique: true 
    }, 
    password: DataTypes.STRING, 

}, { 
    freezeTableName: true 
},{ 
    classMethods: { 
     associate: function(db) { 
      User.belongsTo(db.Organization) 
     } 
    } 
}); 
    return User; 
} 

这里是organization.js模型:

module.exports = function(sequelize, DataTypes) { 

var Organization = sequelize.define('organization', { 
    organizationId: { 
     type: DataTypes.INTEGER, 
     field: 'organization_id', 
     autoIncrement: true, 
     primaryKey: true 
    }, 
    organizationName: { 
     type: DataTypes.STRING, 
     field: 'organization_name' 
    }, 
    admin: DataTypes.STRING, 
    members: DataTypes.STRING 
}); 

    return Organization; 
} 

这里就是表附着到db对象分贝的模型索引文件-index.js:

var Sequelize = require('sequelize'); 
var path = require('path'); 
var config = require(path.resolve(__dirname, '..', '..','./config/config.js')); 
var sequelize = new Sequelize(config.database, config.username, config.password, { 
    host:'localhost', 
    port:'3306', 
    dialect: 'mysql' 
}); 

sequelize.authenticate().then(function(err) { 
    if (!!err) { 
     console.log('Unable to connect to the database:', err) 
    } else { 
     console.log('Connection has been established successfully.') 
    } 
}); 

var db = {} 

db.Organization = sequelize.import(__dirname + "/organization"); 

db.User = sequelize.import(__dirname + "/user"); 

db.Annotation = sequelize.import(__dirname + "/annotation"); 


db.Annotation.associate(db); 

db.sequelize = sequelize; 
db.Sequelize = Sequelize; 

sequelize.sync(); 

module.exports = db; 

这里是路线(/sign-up是我想提出的参考, NCE):

var express = require('express'); 
var siteRoutes = express.Router(); 
var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 
var models = require('../models/db-index'); 

/*==== Passport Configuration ====*/ 

// Serialize sessions 
passport.serializeUser(function(user, done) { 
    console.log(user.user_id + "Serializing"); 
    done(null, user.user_id); 
}); 

passport.deserializeUser(function(user_id, done) { 
    models.User.find({where: {user_id: user_id}}).then(function(user){ 
    done(null, user); 
    }).error(function(err){ 
    done(err, null); 
    }); 
}); 


passport.use('local', new LocalStrategy({ 
    passReqToCallback : true, 
    usernameField: 'email' 
    }, 
    function(req, email, password, done) { 
     //Find user by email 
     models.User.findOne({ 
      where: { 
      email: req.body.email, 
      password: req.body.password 
      } 
     }).then(function(user) { 
      return done(null, user); 
     }) 
     .catch(function(err) { 
      return done(null, false, req.flash('message', 'Email not found.')); 
     }); 
    } 
    )); 




/*==== Index ====*/ 

siteRoutes.get('/', function(req, res){ 
    res.render('pages/index.hbs'); 
}); 

/*==== Login ====*/ 


siteRoutes.route('/login') 

    .get(function(req, res){ 
     res.render('pages/login.hbs'); 
    }) 

    .post(passport.authenticate('local', { 
     successRedirect: '/app', 
     failureRedirect: '/login', 
     failureFlash: 'Invalid username or password.' 
    })); 



siteRoutes.route('/sign-up') 

    .get(function(req, res){ 
     res.render('pages/sign-up.hbs'); 
    }) 

    .post(function(req, res){ 

     models.User.create({ 
      Organization: { 
       organizationName: req.body.organizationName 
      }, 
      firstName: req.body.firstName, 
      lastName: req.body.lastName, 
      email: req.body.email, 
      password: req.body.password 
     },{include: [models.Organization]}).then(function() { 
     res.redirect('/'); 
    }).catch(function(error){ 
     res.send(error); 
    }) 

}); 







module.exports = siteRoutes; 

回答

0

你只联营模式注释

db.Annotation.associate(db); 

忘记

db.User.associate(db); 
+0

感谢您的回答,并指出一个明显的缺陷,但我补充说片断后得到一个新的错误:'db.User.associate(db); ^ TypeError:Object [object SequelizeModel:user]没有方法'associate' at Object。 (/Users/user/Desktop/Projects/node/synotate/app/models/db-index.js:26:9)' – cphill

+0

我想清楚为什么会发生第二个问题。在我的模型中,我添加了一个附加条件,即sequelize不会被识别为我的对象的选项部分。在删除classMethods部分的{}后,我没有收到错误消息。 – cphill