node.js - 尝试创建 HABTM 连接 Sequelize.js

标签 node.js sequelize.js

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

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

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

用户书模型:
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;
};

最佳答案

在您的 User 模型中,您尝试与未在该范围内定义的模型创建关联。在 User.js 中,您只能访问 User,而不能访问未定义的 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 一次同步所有模型,并附加一个回调以等待同步完成(请参阅我发布的代码示例链接)

关于node.js - 尝试创建 HABTM 连接 Sequelize.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23559178/

相关文章:

javascript - NodeJs JSON 解析问题

javascript - Node.js 从回调函数中提取值

javascript - 如何在 sequelize 中使用 afterCreate Hook 创建另一个实例

sql - 同一张表的三元关联

mysql - Sequelize (mysql) 中的小写列值 - Node JS

sequelize.js - Sequelize 1 :m associations: set method is removing previous associations?

javascript - 映射循环内的条件语句

javascript - 如何从具有多个源文件的 gulp 任务一次返回所有流?

node.js - Sequelize 关联错误无法读取未定义的属性 'getTableName'

javascript - 无法使用 NodeJs 使用新的 v3 Sendgrid API 发送电子邮件