简体   繁体   English

在Sequelize中包含来自findOne查询的模型会返回错误

[英]Including models from a findOne query in Sequelize returns error

I am trying to get a venue by it's ID from the database using Sequelize as an ORM. 我正在尝试使用Sequelize作为ORM从数据库中获取其ID的场所。 I've set up the models in a belongsTo association. 我已经在belongsTo关联中设置了模型。 So 1 venue can have 1 phone number as well as 1 address. 因此,1个场地可以具有1个电话号码和1个地址。 I did read the documentation of Sequelize located on their website but without finding a fix for this issue. 我确实阅读了他们网站上Sequelize的文档,但没有找到解决此问题的方法。 Below I've provided you with the Query, the error message and the way that the models are connected with each other. 在下面,我为您提供了查询,错误消息以及模型之间的连接方式。

This is the query: 这是查询:

function findById(id) {
  return this.findOne({
    where: { id: id },
    include: [
      {
        model: models.Address,
        as: "venue_address"
      },
      {
        model: models.PhoneNumber,
        as: "phone_number"
      }
    ]
  }).then((venue) => {
    if (!venue) {
      return utils.createError(404, `Venue with id ${id} does not exist`);
    }
    return venue;
  });
}

Sequelize is returning the following error: Sequelize返回以下错误:

TypeError: Cannot read property 'getTableName' of undefined
    at Function._validateIncludedElement (/Users/kevin/Tabbs/API-Mysql/node_modules/sequelize/lib/model.js:465:30)
    at options.include.options.include.map.include (/Users/kevin/Tabbs/API-Mysql/node_modules/sequelize/lib/model.js:395:37)
    at Array.map (<anonymous>)
    at Function._validateIncludedElements (/Users/kevin/Tabbs/API-Mysql/node_modules/sequelize/lib/model.js:390:39)
    at Promise.try.then.then (/Users/kevin/Tabbs/API-Mysql/node_modules/sequelize/lib/model.js:1576:14)
    at tryCatcher (/Users/kevin/Tabbs/API-Mysql/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/Users/kevin/Tabbs/API-Mysql/node_modules/bluebird/js/release/promise.js:512:31)
    at Promise._settlePromise (/Users/kevin/Tabbs/API-Mysql/node_modules/bluebird/js/release/promise.js:569:18)
    at Promise._settlePromise0 (/Users/kevin/Tabbs/API-Mysql/node_modules/bluebird/js/release/promise.js:614:10)
    at Promise._settlePromises (/Users/kevin/Tabbs/API-Mysql/node_modules/bluebird/js/release/promise.js:693:18)
    at Async._drainQueue (/Users/kevin/Tabbs/API-Mysql/node_modules/bluebird/js/release/async.js:133:16)
    at Async._drainQueues (/Users/kevin/Tabbs/API-Mysql/node_modules/bluebird/js/release/async.js:143:10)
    at Immediate.Async.drainQueues [as _onImmediate] (/Users/kevin/Tabbs/API-Mysql/node_modules/bluebird/js/release/async.js:17:14)
    at runCallback (timers.js:756:18)
    at tryOnImmediate (timers.js:717:5)
    at processImmediate [as _immediateCallback] (timers.js:697:5)
Unhandled rejection Error: Transaction cannot be rolled back because it has been finished with state: commit
    at Transaction.rollback (/Users/kevin/Tabbs/API-Mysql/node_modules/sequelize/lib/transaction.js:85:35)
    at models.Address.createAddress.then.catch (/Users/kevin/Tabbs/API-Mysql/server/routes/venue.js:57:13)
    at tryCatcher (/Users/kevin/Tabbs/API-Mysql/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/Users/kevin/Tabbs/API-Mysql/node_modules/bluebird/js/release/promise.js:512:31)
    at Promise._settlePromise (/Users/kevin/Tabbs/API-Mysql/node_modules/bluebird/js/release/promise.js:569:18)
    at Promise._settlePromise0 (/Users/kevin/Tabbs/API-Mysql/node_modules/bluebird/js/release/promise.js:614:10)
    at Promise._settlePromises (/Users/kevin/Tabbs/API-Mysql/node_modules/bluebird/js/release/promise.js:689:18)
    at Async._drainQueue (/Users/kevin/Tabbs/API-Mysql/node_modules/bluebird/js/release/async.js:133:16)
    at Async._drainQueues (/Users/kevin/Tabbs/API-Mysql/node_modules/bluebird/js/release/async.js:143:10)
    at Immediate.Async.drainQueues [as _onImmediate] (/Users/kevin/Tabbs/API-Mysql/node_modules/bluebird/js/release/async.js:17:14)
    at runCallback (timers.js:756:18)
    at tryOnImmediate (timers.js:717:5)
    at processImmediate [as _immediateCallback] (timers.js:697:5)

The models are associated like this: 这些模型是这样关联的:

models.Venue.belongsTo(models.PhoneNumber, {
      as: "phone_number",
      onDelete: "CASCADE",
      foreignKey: { allowNull: false }
    });
    models.Venue.belongsTo(models.Address, {
      as: "venue_address",
      onDelete: "CASCADE",
      foreignKey: { allowNull: false }
    });

This is what I am receiving back when I do not include anything: 当我不包含任何内容时,这就是我收到的信息:

在此处输入图片说明

Appreciate all the help fixing this issue! 感谢所有解决此问题的帮助!

I think your tables are being initialized out of order. 我认为您的表正在按顺序初始化。 If you see my example here: Example Index File you will notice that I have an array of models in a specific order which I loop through to initialize the tables. 如果在这里看到我的示例: 索引文件示例,您会注意到我有一个特定顺序的模型数组,我循环遍历这些数组以初始化表。 I think you have a foreign key dependency that is not being initialized before the association is being created and this is why you are seeing this error. 我认为您具有在创建关联之前尚未初始化的外键依赖关系,这就是为什么您看到此错误的原因。

Short answer: You need to make sure foreign key dependencies are initialized before the dependent relation. 简短答案:您需要确保在依赖关系之前初始化外键依赖关系。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM