node.js - 在 Node 中设置 Sequelize 关联 - Postman 抛出约束错误

标签 node.js sequelize.js postman

我正在尝试正确设置我的 Sequelize 关联,以便在我提出请求时提取所有“包含”数据。我已经在文档中看到了与此相关的信息,但是如果没有在应用程序中看到它,有点难以理解。
我以前有过关联,但是他们从来没有提取过外键值,而且我在 API 中只有“包含所有”。我现在有更具体的“包括:[“articleType”] 在我的数据拉取开始时。因为我在没有迁移的情况下工作,所以我不确定我是否正确更新了 pgAdmin(我只为那些我添加了外键由于唯一约束错误,不允许从主键中生成外键)。
理想情况下,我只想让我的后端 API 以最有效的方式提取外键值,因为我无法弄清楚我哪里出错了。我没有迁移,因为这只是一个项目,所以如果 Pgadmin 中的信息没有被复制,这可能是一个原因。
首先,PGadmin 中的 我应该如何反射(reflect)模型中的约束?这些可以手动完成吗?我看不到 manyToMany、belongTo 等,只有简单的外键限制到另一个表上的主键。
其次 ,在我下面的模型上,我是否需要在两个相关模型上声明键?在 PGadmin 中,我无法在主键上声明外键,而它可以从另一个表到主键正常工作。
有没有办法手动添加 SQL 连接,即使使用 Sequelize,以便在 JSON 中包含正确的外键值?我以前有使用 PHP/PHPmyAdmin 的经验,使用它要容易得多。从我可以看到我的文章模型在 Pgadmin 和我的后端文件中都引用了 articleType 模型,我也在我的 Controller API 中引用了它们(这似乎导致了错误,因为其他 API 在没有“包含”的情况下正常工作"方法中的一部分)。
enter image description here
enter image description here
物品模型

    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;
文章类型模型
    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;
}
物品 Controller
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 文件中的模型文件夹中创建了许多关联,但是我现在在实际模型中只有这些。这些需要同时放入吗?
enter image description here

最佳答案

我可能认为问题在于您提供给 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);
        })
}

关于node.js - 在 Node 中设置 Sequelize 关联 - Postman 抛出约束错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66996162/

相关文章:

javascript - Electron - 为什么与 HTML 文件相比,通过本地主机加载主窗口时会有很大的延迟?

node.js - Sequelize save() 问题

unit-testing - 运行 Postman jetpack 测试以为 Newman 命令

javascript - 为什么我的 JavaScript 代码收到“"No ' Access-Control-Allow-Origin' header is present on the requested resources”错误,而 Postman 却没有?

node.js - 将带有表单的文件从 nuxt 发送到 Node 服务器(nodemailer)

javascript - Node js 中的新日期(年、月、日)自动转换为 UTC 时区

javascript - Puppeteer - 使用 querySelectorAll() 访问动态 HTML 环境中的元素

sequelize.js - Sequelize - 查询对象及其子对象

javascript - 为什么我的函数在 NodeJS、Sequelize 中返回 null

json - 如何将带有字节数组的JSON发送到Web API/ postman