【问题标题】:How to apply Foreign Key in table model using Sequelize in NodeJs?如何在 NodeJs 中使用 Sequelize 在表模型中应用外键?
【发布时间】:2021-01-12 00:19:09
【问题描述】:

我只是在学习如何在 NodeJs 中使用 Sequelize 来访问 MySQL 数据库,但是在创建模型时我遇到了外键问题。任何人都可以建议我应该如何申请,因为我已经尝试过但它抛出了错误。

模型

exam_category.js

const Sequelize = require('sequelize');
const sequelize = require('../../database');

const ExamCategory = sequelize.define('exam_category', {
    id:{ type: Sequelize.BIGINT, autoIncrement: true, allowNull: false, primaryKey: true }, 
    exam_category_name: { type: Sequelize.STRING, allowNull: false },
    isActive: { type: Sequelize.BOOLEAN, allowNull: false },
    createdBy: { type: Sequelize.STRING, allowNull: true },
    createdAt: { type: Sequelize.DATE, allowNull: false }
}, { timestamps: false });

module.exports = ExamCategory;

exam.js

const Sequelize = require('sequelize');
const sequelize = require('../../database');

const Exam = sequelize.define('exam', { 
    id:{ type: Sequelize.BIGINT, autoIncrement: true, allowNull: false, primaryKey: true }, 
    startDate: { type: Sequelize.STRING, allowNull: false }, 
    endDate: { type: Sequelize.STRING, allowNull: false },
    startTime: { type: Sequelize.STRING, allowNull: false }, 
    endTime: { type: Sequelize.STRING, allowNull: false },
    examDuration: { type: Sequelize.INTEGER, allowNull: false },
    examName: { type: Sequelize.STRING, allowNull: false },
    examKey: { type: Sequelize.STRING, allowNull: false, unique: true },
    exam_category_id: { type: Sequelize.BIGINT, allowNull: false, references: 'exam_category', referencesKey: 'id' },
    isActive: { type: Sequelize.BOOLEAN, allowNull: false },
    createdBy: { type: Sequelize.STRING, allowNull: true },
    createdAt: { type: Sequelize.DATE, allowNull: false }
}, { timestamps: false });

module.exports = Exam;

然后在 app.js 我写了这个:

const sequelize = require('./database');
const adminUser = require('./models/users/admin_user');
const examCategory = require('./models/users/exam_category');
const exam = require('./models/users/exam');
examCategory.ExamCategory.hasMany(exam.Exam, {
    foreignKey: 'exam_id',
    sourceKey: 'id'
});
exam.Exam.belongsTo( examCategory.ExamCategory, {
    foreignKey: 'exam_id',
    targetKey: 'id'
});
sequelize.sync();
sequelize.sync({ force: true });

这是我的 database.js

const Sequelize = require('sequelize');
const examCategory = require('./exam_category');

const db = new Sequelize(
    'otp_node', 'root', 'root',
    {
        dialect: 'mysql',
        host: 'localhost'
    }
);
module.exports = db;

错误

PS D:\practice\otp\frontend> 节点 .\server.js 内部/模块/cjs/loader.js:968 抛出错误; ^

错误:找不到模块“./exam_category”需要堆栈:

  • D:\practice\otp\frontend\backend\database.js
  • D:\practice\otp\frontend\backend\app.js
  • D:\practice\otp\frontend\server.js 在 Function.Module._resolveFilename (internal/modules/cjs/loader.js:965:15) 在 Function.Module._load (internal/modules/cjs/loader.js:841:27) 在 Module.require (internal/modules/cjs/loader.js:1025:19) 在需要(内部/模块/cjs/helpers.js:72:18) 在对象。 (D:\practice\otp\frontend\backend\database.js:2:22)
    在 Module._compile (internal/modules/cjs/loader.js:1137:30) 在 Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10) 在 Module.load (internal/modules/cjs/loader.js:985:32) 在 Function.Module._load (internal/modules/cjs/loader.js:878:14) 在 Module.require (internal/modules/cjs/loader.js:1025:19) { 代码:'MODULE_NOT_FOUND',requireStack:[ 'D:\practice\otp\frontend\backend\database.js', 'D:\practice\otp\frontend\backend\app.js', 'D:\practice\otp\frontend\server.js' ] } PS D:\practice\otp\frontend>

作为参考,这是我的代码Github Repo。 谁能帮我解决这个问题?

【问题讨论】:

  • 显示你遇到的错误
  • @Anatoly 用错误更新了问题

标签: mysql node.js database orm sequelize.js


【解决方案1】:

你可以试试这个在你的表中添加外键

app.js

const sequelize = require('./database');
const adminUser = require('./models/users/admin_user');
const ExamCategory = require('./models/users/exam_category');
const Exam = require('./models/users/exam');
ExamCategory.hasMany(exam, {
    foreignKey: 'exam_id',
    sourceKey: 'id'
});
Exam.belongsTo( examCategory, {
    foreignKey: 'exam_id',
    targetKey: 'id'
});
sequelize.sync();
sequelize.sync({ force: true });  

在您关联表格的文件中添加上述代码,它将在您的表格中添加foreign_key作为名称exam_id,您可以随意命名

你可以在这个doc了解更多关于foreignKey和表之间的关系

查看此repository,以便您了解如何使用 sequelize 也是节点续集的boilerplate

【讨论】:

  • 嗨@Arya,我已经尝试过您的解决方案,但出现错误我已根据您的错误回答更新了问题。
  • 更新您的 app.js 文件,如我在回答中所示,然后尝试
  • 我已经在问题中更新了,请检查:)
  • 作为问题底部的参考,我已经添加了代码的公共 github 存储库。
  • 如果它有助于放弃投票并接受答案,那么它将帮助其他人理解
猜你喜欢
  • 2016-05-27
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
相关资源
最近更新 更多