【问题标题】:How to define table associations with sequelize. TypeError: User.hasMany is not a function如何使用 sequelize 定义表关联。 TypeError: User.hasMany 不是函数
【发布时间】:2019-09-24 07:08:46
【问题描述】:

我正在开发 E-commerce Express API,并且正在使用“sequelize”模块进行数据库操作。 现在我只有两张桌子: 而我的项目结构如下:

bin
 -www
config
 -database.js
models
 -order.js
 -user.js
routes
 -user.js
.env
app.js
package.json
package-lock.json

database.js 文件:

    require('dotenv').config();
    const Sequelize = require('sequelize');

    module.exports = new Sequelize(
        process.env.DATABASE_NAME,
        process.env.DATABASE_USERNAME,
        process.env.DATABASE_PASSWORD, {
            port: process.env.DATABASE_PORT,
            host: process.env.DATABASE_HOST,
            dialect: 'mysql',
        }

);

User.hasMany(Order);
Order.belongsTo(User, {constraints: false});

models-user.js

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

const User = db.define('user', {
    username: {
        type: Sequelize.STRING(32),
        unique: true,
        primaryKey: true,
        allowNull: false
    },
    email: {
        type: Sequelize.STRING(254),
        unique: true,
        allowNull: false,
    },
    password: {
        type: Sequelize.STRING(128),
        allowNull: false,
    },
    /*name: {
        type: Sequelize.STRING
    },
    isAdmin: {
        type: Sequelize.BOOLEAN
    },*/
}, {
    freezeTableName: true,
    timestamps: false,
    underScored: true
    });

modules.exports=User;

models-order.js

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

const Order = db.define('order', {
        id: {
            type: Sequelize.INTEGER,
            primaryKey: true,
            autoIncrement: true,
            allowNull: false
        },
        dateTime: {
            type: Sequelize.DATE,
            allowNull: false
        },
        totalPrice: {
            type: Sequelize.INTEGER,
            allowNull: false
        }
    }, {
        freezeTableName: true,
        timestamps: false,
        underscored: true
    }
    );

module.exports=Order;

当我启动应用程序时,我得到

TypeError: User.hasMany is not a function
at Object.<anonymous> (C:\Users\danfe\Documents\GitHub\USocks_Backend\config\database.js:23:6)
at Module._compile (internal/modules/cjs/loader.js:701:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
at Module.load (internal/modules/cjs/loader.js:600:32)
at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
at Function.Module._load (internal/modules/cjs/loader.js:531:3)
at Module.require (internal/modules/cjs/loader.js:637:17)
at require (internal/modules/cjs/helpers.js:22:18)
at Object.<anonymous> (C:\Users\danfe\Documents\GitHub\USocks_Backend\models\user.js:1:74)
at Module._compile (internal/modules/cjs/loader.js:701:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
at Module.load (internal/modules/cjs/loader.js:600:32)
at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
at Function.Module._load (internal/modules/cjs/loader.js:531:3)
at Module.require (internal/modules/cjs/loader.js:637:17)
at require (internal/modules/cjs/helpers.js:22:18)
at Object.<anonymous> (C:\Users\danfe\Documents\GitHub\USocks_Backend\config\passport.js:6:14)
at Module._compile (internal/modules/cjs/loader.js:701:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
at Module.load (internal/modules/cjs/loader.js:600:32)
at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
at Function.Module._load (internal/modules/cjs/loader.js:531:3)

我做了一些谷歌搜索,它可能与循环依赖有关?但我敢肯定,我有疑问: 1. 怎么了? 2. 我是否正确定义了关联? 3. 什么是定义关联的正确方法?

【问题讨论】:

标签: node.js express sequelize.js associations


【解决方案1】:

您的运行时不知道 database.js 中的用户和订单是什么。这类似于使用变量而不定义或初始化它。您需要使用

在 database.js 中导入 User 和 Order 模型

const User = require("../models/user.js"); const Order = require("../models/order.js")

您还可以在模型本身内部定义关联。 在 models/order.js 内部和 module.exports 之前 -

Order.associate = function(models) {
Order.belongsTo(models.User,{
  foreignKey:user_id
}) 

但要使其正常工作,您必须对 sequelize 进行属性初始化。

您应该使用 sequelize-cli 以正确的方式生成 config.json、模型、迁移和种子。这样,您只需在整个项目中导入一个 db 对象,您就可以以正确的方式访问所有模型。

【讨论】:

    【解决方案2】:

    是的,它来自循环依赖。当您调用“User.hasMany(Order)”时,用户尚未定义。当您想使用此关系时,请在放置之前调用“hasMany”和“belongTo”

    【讨论】:

      猜你喜欢
      • 2016-07-30
      • 1970-01-01
      • 2017-10-15
      • 2013-06-23
      • 2021-08-21
      • 2019-01-06
      • 1970-01-01
      • 2021-05-12
      • 2020-05-22
      相关资源
      最近更新 更多