首页 > 解决方案 > Sequelize 关联/模型在没有任何更改时突然无法识别,模糊错误无法读取未定义的属性“字段”

问题描述

我一直在使用 React、node、sequelize、Redux 从事这个项目一段时间,并且一切都运行良好。前几天我决定更新我的一些节点包,因为我经常尝试这样做,但是 Sequelize 在我运行后突然坏了npm update --save/--save-dev

突然之间,当我尝试运行该应用程序时,我对 sql 的初始提取失败,并且我的 sequelize 模型抛出一个错误:

/node_modules/sequelize/lib/associations/belongs-to-many.js:130
    this.sourceKeyField = this.source.rawAttributes[this.sourceKey].field || this.sourceKey;
                                                                    ^

TypeError: Cannot read property 'field' of undefined
    at new BelongsToMany (/Users/dlmusic/Desktop/Cullan - Site/Metadata-Tagging-With-Redux/node_modules/sequelize/lib/associations/belongs-to-many.js:130:69)
    at Function.belongsToMany (/Users/dlmusic/Desktop/Cullan - Site/Metadata-Tagging-With-Redux/node_modules/sequelize/lib/associations/mixin.js:64:25)
    at Object.<anonymous> (/Users/dlmusic/Desktop/Cullan - Site/Metadata-Tagging-With-Redux/authenticationBI.js:63:12)
    at Module._compile (internal/modules/cjs/loader.js:776:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:787:10)
    at Module.load (internal/modules/cjs/loader.js:643:32)
    at Function.Module._load (internal/modules/cjs/loader.js:556:12)
    at Module.require (internal/modules/cjs/loader.js:683:19)
    at require (internal/modules/cjs/helpers.js:16:16)
    at Object.<anonymous> (/Users/dlmusic/Desktop/Cullan - Site/Metadata-Tagging-With-Redux/api/routes/backgroundInstrumentalsRoutes.js:6:36)
    at Module._compile (internal/modules/cjs/loader.js:776:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:787:10)
    at Module.load (internal/modules/cjs/loader.js:643:32)
    at Function.Module._load (internal/modules/cjs/loader.js:556:12)
    at Module.require (internal/modules/cjs/loader.js:683:19)
    at require (internal/modules/cjs/helpers.js:16:16)
    at Object.<anonymous> (/Users/dlmusic/Desktop/Cullan - Site/Metadata-Tagging-With-Redux/server.js:4:39)
    at Module._compile (internal/modules/cjs/loader.js:776:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:787:10)
    at Module.load (internal/modules/cjs/loader.js:643:32)
    at Function.Module._load (internal/modules/cjs/loader.js:556:12)
    at Function.Module.runMain (internal/modules/cjs/loader.js:839:10)

这很奇怪。我最近才在前端工作。我一个多月都没碰过任何sequelize模型、关联、控制器,更何况关联已经运行了三个多月没有错误,突然就说无效了。

好的。美好的。没有大碍。Sequelize 只是不喜欢其中一个模块,所以我将重置我的 git 头,丢弃我的模块文件夹,并找出它不喜欢哪个模块。

我重置 git head,删除我的模块文件夹,然后运行npm i​​.

当我以前从未收到此错误时,仍然会出现相同的错误。

这会阻止创建 sequelize 关联表,因此我的应用程序甚至无法启动。

我注释掉导致错误的 sequelize 关联,现在 sequelize 运行良好,但我需要这些关联才能使我的应用程序的某些功能正常工作。

我正准备拔掉我的头发,这狗屎让我很沮丧。我什至不知道该怎么办了。我试图通过改变方法来扰乱我的联想,但实际上没有任何效果。

以下是它显然存在问题的续集关联。澄清一下,每个类别可以有多个样式,但每个样式只有一个类别。

CategoryBI.belongsToMany(StyleBI,
  { constraints: false,
    timestamps: false,
    foreignKey: "cat_id",
    sourceKey: "style_id",
    through: "cat_styles"
  });

StyleBI.belongsTo(CategoryBI,
  { constraints: false,
    timestamps: false,
    foreignKey: "cat_id",
    targetKey: "cat_id",
    through: "cat_styles"
  });

和模型:

module.exports = function(sequelize, DataTypes) {
  return sequelize.define("categories", {
    cat_id: {
      type: DataTypes.INTEGER(11),
      allowNull: false,
      primaryKey: true,
      autoIncrement: true
    },
    cat_name: {
      type: DataTypes.STRING(50),
      allowNull: true
    }
  }, {
    tableName: "categories",
    underscored: true,
    timestamps: false
  });
};
module.exports = function(sequelize, DataTypes) {
  return sequelize.define("styles", {
    style_id: {
      type: DataTypes.INTEGER(11),
      allowNull: false,
      primaryKey: true,
      autoIncrement: true
    },
    cat_id: {
      type: DataTypes.INTEGER(8),
      allowNull: false,
      defaultValue: "0"
    },
    style_name: {
      type: DataTypes.STRING(50),
      allowNull: true
    },
    style_img: {
      type: DataTypes.STRING(55),
      allowNull: true
    }
  }, {
    tableName: "styles",
    underscored: true,
    timestamps: false
  });
};

标签: node.jsreactjsexpressreduxsequelize.js

解决方案


所以我改变了关联语法,它又开始工作了。我对协会如何突然停止工作感到完全困惑,但这是我将其更改为的。

CategoryBI.hasMany(StyleBI,
  { constraints: false,
    timestamps: false,
    foreignKey: "style_id",
    sourceKey: "cat_id"
  });

StyleBI.belongsTo(CategoryBI,
  { constraints: false,
    timestamps: false,
    foreignKey: "style_id",
    targetKey: "cat_id"
  });

我删除了直通表并翻转了关联键。


推荐阅读