2
votes

I'm building my first node.js app. I use express js and sequelize to handle Data objects. I would like to build a model object containing all the models of my application but I get errors doing this. What is causing them?

In models/User.js :

module.exports = function(sequelize, DataTypes) {
    return sequelize.define('User', {
        id : DataTypes.INTEGER,
        firstName : DataTypes.STRING,
        lastName : DataTypes.STRING,
        email : DataTypes.STRING,
        login : DataTypes.STRING,
        password : DataTypes.STRING,
        isAdmin : DataTypes.BOOLEAN
     });
};

In models/Project.js :

module.exports = function(sequelize, DataTypes) {
return sequelize.define('Project', {
    id : DataTypes.INTEGER,
    projectName : DataTypes.STRING
});
};

In models/Models.js :

var Sequelize = require('sequelize');
var env = process.env.NODE_ENV || "development";
var config = require(__dirname + '/../config/config.json')[env];

// initialize database connection
var sequelize = new Sequelize(config.name, config.username, config.password);

// load models
var models = [ 'Project', 'User' ];
models.forEach(function(model) {
    console.log(__dirname + '/' + model);
    console.log(sequelize.import(__dirname + '/' + model));
    module.exports[model] = sequelize.import(__dirname + '/' + model);
});

// describe relationships
(function(m) {
    m.Project.belongsToMany(m.User, {
        through : 'UserProject'
    });
    m.User.belongsToMany(m.Project, {
        through : 'UserProject'
    });
})(module.exports);

// export connection
module.exports.sequelize = sequelize;

When I try to run my app.js, I get the following error:

/home/julien/Developpements/nodejs/rmtool/node_modules/sequelize/lib/utils.js:51 turn str.trim().replace(/[-_\s]+(.)?/g, function(match, c){ return c.toUpperCa ^ TypeError: Cannot read property 'toUpperCase' of undefined at /home/julien/Developpements/nodejs/rmtool/node_modules/sequelize/lib/utils.js:51:75 at String.replace (native) at Object.module.exports.camelize (/home/julien/Developpements/nodejs/rmtool/node_modules/sequelize/lib/utils.js:51:23) at Object.module.exports.camelizeIf (/home/julien/Developpements/nodejs/rmtool/node_modules/sequelize/lib/utils.js:18:22) at new BelongsToMany (/home/julien/Developpements/nodejs/rmtool/node_modules/sequelize/lib/associations/belongs-to-many.js:112:56) at Mixin.belongsToMany (/home/julien/Developpements/nodejs/rmtool/node_modules/sequelize/lib/associations/mixin.js:297:21) at /home/julien/Developpements/nodejs/rmtool/models/Model.js:20:13 at Object. (/home/julien/Developpements/nodejs/rmtool/models/Model.js:26:4) at Module._compile (module.js:460:26) at Object.Module._extensions..js (module.js:478:10) at Module.load (module.js:355:32) at Function.Module._load (module.js:310:12) at Module.require (module.js:365:17) at require (module.js:384:17) at Object. (/home/julien/Developpements/nodejs/rmtool/routes/login.js:9:13) at Module._compile (module.js:460:26)

1

1 Answers

1
votes

It seems odd to be declaring the relationships when the canonical form is more like:

module.exports = function(sequelize, DataTypes) {
  var User = sequelize.define('User', {
    id : DataTypes.INTEGER,
    firstName : DataTypes.STRING,
    lastName : DataTypes.STRING,
    email : DataTypes.STRING,
    login : DataTypes.STRING,
    password : DataTypes.STRING,
    isAdmin : DataTypes.BOOLEAN
 }, {
  classMethods: {
    associate: function(models) {
      User.belongsToMany(models.Project, {
        through: 'UserProject'
      });
    }
  }
 });

  return User;
};

The associate method is called after all models are loaded to avoid dependency issues.

Also try calling it models/index.js so you can just require('./models')