Как определить ассоциации таблиц с sequelize.TypeError: User.hasMany не является функцией - PullRequest
0 голосов
/ 06 мая 2019

Я работаю над E-commerce Express API и использую модуль 'sequelize' для манипулирования базой данных. На данный момент у меня есть только две таблицы: database И моя структура проекта выглядит следующим образом:

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});

модель-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;

модель-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. Как правильно различать ассоциации?

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Да, это от круговой зависимости. Когда вы вызываете «User.hasMany (Order)», пользователь еще не определен. Звоните «hasMany» и «ownTo» перед местом, когда вы хотите использовать это отношение

0 голосов
/ 13 мая 2019

Ваша среда выполнения не имеет представления о том, что такое пользователь и порядок внутри database.js.Это похоже на использование переменной без ее определения или инициализации.Вам необходимо импортировать модель User and Order в database.js, используя

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 для генерации вашей конфигурации.json, модели, миграции и семена в правильном пути.Таким образом, вам просто нужно импортировать один объект БД по всему вашему проекту, и вы получите доступ ко всем вашим моделям правильным образом.

...