【问题标题】:Setting Sequelize associations in Node - Postman throwing constraint errors在 Node 中设置 Sequelize 关联 - 邮递员抛出约束错误
【发布时间】:2021-07-03 20:40:34
【问题描述】:

我正在尝试正确设置我的 Sequelize 关联,以便在我提出请求时提取我的所有“包含”数据。我已经在文档中看到了与此相关的信息,但是如果没有在应用程序中看到它有点难以理解。

我以前有关联,但他们从未提取外键值,我只有在 API 中“包含所有”。我现在在数据拉取开始时有更具体的“包括:[”articleType”]。由于我在没有迁移的情况下工作,我不确定我是否正确更新了 pgAdmin(我只将外键放入我的由于唯一约束错误,不允许从主键中创建外键)。

理想情况下,我只想让我的后端 API 以最有效的方式提取外键值,因为我不知道哪里出错了。我没有迁移,因为这只是一个项目,所以如果信息没有在 Pgadmin 中重复,这可能是一个原因。

首先在 PGadmin 中我应该如何反映我在模型中的约束?这些可以手动完成吗?我看不到 manyToMany、belongTo 等,只有简单的外键限制到另一个表上的主键。

其次,在我的以下模型上,我需要在两个相关模型上声明键吗?在 PGadmin 中,我无法在主键上声明外键,而它从另一个表到主键工作正常。

是否有办法手动添加 SQL 连接,即使使用 Sequelize,以便在 JSON 中包含正确的外键值?我以前有使用 PHP / PHPmyAdmin 的经验,并且使用它要容易得多。从我可以看到我的文章模型在 Pgadmin 和我的后端文件中引用 articleType 模型,并且我还在我的控制器 API 中引用它们(这似乎导致错误,因为其他 API 在没有“包含”的情况下正常工作" 方法中的一部分)。

文章模型

    const article = sequelize.define("articles", {

            articleID: {
                type: Sequelize.INTEGER,
                primaryKey: true,
                autoIncrement: true,
                allowNull: false
            },
            articleTitle: {
                type: Sequelize.TEXT
            },
            articleContent: {
                    type: Sequelize.TEXT
            },
            photos: {
                type: Sequelize.TEXT
            },
            userID: {
                type: Sequelize.INTEGER
            },
            articleTypeID: {
                type: Sequelize.INTEGER
            }},
            {
                timestamps: false
            }, {});
            article.associate = function(models) {
                article.hasMany(models.articleType, {
                    foreignKey: "articleTypeID",
                    as: "articleType_FK"});
                article.hasMany(models.userLogin, {
                    foreignKey: "userID",
                    as: "userLogin_FK"});
            }
    return article;

articleType 模型

    const articleType = sequelize.define("articleTypes", {

            articleTypeID: {
                type: Sequelize.INTEGER,
                primaryKey: true,
                autoIncrement: true,
                allowNull: false,
            },
            articleType: {
                type: Sequelize.TEXT
            }},
        {
            timestamps: false
        },{});
        articleType.associate = function(models) {
            articleType.belongsTo(models.article, {
                foreignKey: "articleTypeID",
                as: "article",
            });
        }
    return articleType;
}

物品控制器

exports.articleList = (req, res) => {
    // article.findByPk(articleID, { include: ["articleType"] });
    article.findAll({
        **include: [{ model: articleType, as: 'fki_articleType_FK'},
                  { model: userLogin, as: 'fki_userID_FK'}]
    })**
        .then((article) => {
            const articleList = [];

更新

我之前在模型文件夹中的 index.js 文件中创建了许多关联,但现在我只在实际模型中拥有这些关联。这两个都需要放吗?

【问题讨论】:

  • 您已将关系别名为“articleType_FK”,请改为在包含中尝试
  • 我已经更改了它,我得到了一个“文章中不存在别名为 \"articleType_FK\" 的消息关联”。
  • 你能展示你的models/index.js的样子吗?问题可能是关联未初始化,因此 Sequelize 不知道您的模型之间的关联是什么 ||||||另外请添加您现在获得的最新错误快照。
  • 另外,请在所有 sequelize.define |||| 中删除模型名称中的“s” const articleType = sequelize.define("articleType", { & const article = sequelize.define("article", { ||||||我认为在进行此更改后它会正常工作
  • 我的索引文件和模型中都需要关联吗?我是否需要再次运行 Sequelize sync true 以便这些反映在 pgAdmin 中?我没有迁移,所以这些不会自动更新。

标签: node.js sequelize.js postman


【解决方案1】:

试试下面的代码,希望你的问题能解决。

module.exports = (sequelize, DataTypes) => {
    const ArticleTypes = sequelize.define(
        'articleTypes',
        {
            uuid: {
                type: DataTypes.UUID,
                defaultValue: DataTypes.UUIDV4,
                unique: true
            }
            // Your article type schema ...
        },
        {
            timestamps: true,
            schema: 'articleTypes'
        }
    );
    return ArticleTypes;
};
module.exports = (sequelize, DataTypes) => {
    const Articles = sequelize.define(
        'articles',
        {
            uuid: {
                type: DataTypes.UUID,
                defaultValue: DataTypes.UUIDV4,
                unique: true
            }
            // Your article schema ...
        },
        {
            timestamps: true,
            schema: 'articles'
        }
    );
    Articles.associate = (models) => {
        Articles.belongsTo(models.ArticleTypes, {
            as: 'ArticleTypes',
            foreignKey: 'articleTypeID'
        });
    };
    return Articles;
};

像上面一样创建模型。其余部分与您使用的相同。

【讨论】:

    【解决方案2】:

    我可能认为问题在于您提供给 seuqelize 以及之后在 Association 中使用的模型名称。

     const article = sequelize.define("articles", {...
    

    这会生成一个名为 - articles 的模型,可通过 models.articles 访问您的关联。
    问题出现在这里:

    articleType.associate = function (models) {
        articleType.belongsTo(models.article, { // models.article will be undefined
            foreignKey: "articleTypeID",
            as: "article",
        });
    
    // This below should rather work
    articleType.associate = function (models) {
        articleType.belongsTo(models.articles, { // models.articles exist as you told Sequelize to name it with that extra 's'
            foreignKey: "articleTypeID",
            as: "article",
        });
    }
    }
    

    但最好在没有s 的情况下提及模型名称,以免造成问题和混乱

    那么什么会起作用?:

    // ------------------------------------------------------------------
    // models/article.js
    const article = sequelize.define("article", {
      //attributes
    }, {
      // options
    });
    article.associate = function (models) {
        article.hasMany(models.articleType, {
            foreignKey: "articleTypeID",
            as: "articleType_FK"
        });
      // other associations
    }
    return article;
    
    // ------------------------------------------------------------------
    // models/articleType.js
    const articleType = sequelize.define("articleType", {
        // attributes
    }, {
        // options
    });
    articleType.associate = function (models) {
        articleType.belongsTo(models.article, {
            foreignKey: "articleTypeID",
            as: "article",
        });
    }
    return articleType;
    
    // ------------------------------------------------------------------
    // controller
    exports.articleList = (req, res) => {
        // article.findByPk(articleID, { include: ["articleType"] });
        article
            .findAll({
                include: [{
                    model: articleType, as: 'articleType_FK',
                }, {
                    model: userLogin, as: 'userID_FK',
                }],
            })
            .then((articles) => {
                console.log('articles', articles);
            })
    }
    

    【讨论】:

    • 我已经完成并匹配了所有外键,并将它们复制到我的 index.js 文件中。看起来我已经取得了进展,并且系统似乎可以识别它们但是我现在在应该有值时得到空数组。这通常意味着我哪里出错了?控制器 API?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 2023-03-26
    • 2016-04-30
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多