【问题标题】:Try to create HABTM connection Sequelize.js尝试创建 HABTM 连接 Sequelize.js
【发布时间】:2014-05-09 17:24:23
【问题描述】:

我正在尝试使用 Sequelize 创建 HABTM 关系,但我无法完成......我仍然收到一条错误消息:

    return (tableName1.toLowerCase() < tableName2.toLowerCase()) ? (tableName1
                                                  ^
TypeError: Cannot call method 'toLowerCase' of undefined

我有一个 User 模型、一个 Book 模型和一个 UserBooks 模型。当然,我的数据库包含一个“users”表、“user_books”表和“books”表。

UserBooks 模型:

module.exports = function(schema, DataTypes) {
  var UserBooks = schema.define('UserBooks', {
   }, {
    tableName: 'user_books', // this will define the table's name
    timestamps: false // this will deactivate the timestamp columns
  });

  UserBooks.sync();
  return UserBooks;
};

用户模型:

module.exports = function(schema, DataTypes) {
  var User = schema.define('User', {
    keywords: DataTypes.STRING
  }, {
    tableName: 'users', // this will define the table's name
    timestamps: false ,// this will deactivate the timestamp columns
    syncOnAssociation:false
    });

  User.hasMany(Book, { foreignKey: 'user_id', through: UserBooks });

  User.sync();

  return User;
};

图书模型:

module.exports = function(schema, DataTypes) {
  var Book = schema.define('Book', {
    keywords: DataTypes.STRING
  }, {
    tableName: 'books', // this will define the table's name
    timestamps: false ,// this will deactivate the timestamp columns
    syncOnAssociation:false
    });

  Book.hasMany(User, { foreignKey: 'book_id', through: UserBooks });

  Book.sync();

  return Book;
};

【问题讨论】:

    标签: node.js sequelize.js


    【解决方案1】:

    在您的用户模型中,您尝试创建与未在该范围内定义的模型的关联。在 User.js 中,您只能访问用户,而不是未定义的 Book 或 UserBooks。这就是导致您的错误的原因。

    您可以在将所有模型导入应用的位置创建关联,也可以通过导入要关联的模型在模型文件中创建关联(避免循环导入)。您的用户模型可以更改为:

    module.exports = function(schema, DataTypes) {
      var Book = schema.import(__dirname + '/book');
      var UserBooks = schema.import(__dirname + '/userbooks');
      var User = schema.define('User', {
        keywords: DataTypes.STRING
      }, {
        tableName: 'users', // this will define the table's name
        timestamps: false ,// this will deactivate the timestamp columns
        syncOnAssociation:false
        });
    
      User.hasMany(Book, { foreignKey: 'user_id', through: UserBooks });
      Book.hasMany(User, { foreignKey: 'book_id', through: UserBooks });
    
      return User;
    };
    

    有关如何执行此操作的另一个示例,请参阅http://sequelizejs.com/articles/express#minimal-express-app

    另外,我已经从您的代码中删除了对 User.sync 的调用。同步是异步调用,而导入是同步。这意味着您正在定义您的模型,开始将其同步到数据库,然后在您知道它已完成同步之前将其返回。这意味着您可能会在创建表之前尝试使用它创建实例。相反,您应该使用sequelize.sync 一次同步所有模型,并附加一个回调以等待同步完成(请参阅我发布的链接以获取代码示例)

    【讨论】:

    • 感谢您的回答。如果我在两个模型中都实现了你的答案(所以在用户中我包括 Book,反之亦然),我会收到一个错误:“RangeError:超出最大调用堆栈大小”。如果我从两个文件中删除架构导入并根据您的链接使用其他解决方案(使用 classMethods:{...})我收到错误“Model1 is not associated to Model2”
    • 问题已解决。您的解决方案有效!另一个问题是lowerdash,可能与我们的underscoreJS 冲突。另一位开发人员更改了 index.js 并将 lowerdash 替换为下划线。现在一切正常!
    • 很高兴听到它对您有用。 rangeError 问题是因为您正在创建循环导入。您开始执行用户文件,它尝试导入书籍,再次尝试导入用户,依此类推
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 2015-03-12
    相关资源
    最近更新 更多