Sequelize: TypeError: User.hasMany не является функцией

1

У меня такое странное поведение. У меня есть модель User и модель клиента. У пользователя много клиентов. Я использую эти документы: http://docs.sequelizejs.com/manual/tutorial/associations.html

Когда я запускаю сервер, Sequelize throws TypeError: User.hasMany не является функцией

Версия узла: 8.9.1
Диалект: postgres
Версия базы данных: Postgres 10
Версия Sequelize : 4.22.15

Следующие файлы находятся в одной папке

Модель user.js

const Sequelize = require('sequelize');
const db = require('../index.js'); //This is an instance of new Sequelize(...)

const tableName = 'users';

const User = db.define('user', {
  firstName: {
    type: Sequelize.STRING(50),
    allowNull: false,
    validate: {
      notEmpty: true
    }
  },
  lastName: {
    type: Sequelize.STRING(50),
    allowNull: false,
    validate: {
      notEmpty: true
    }
  },
  username: { //Username will be the email
    type: Sequelize.STRING(80),
    allowNull: false,
    unique: true,
    validate: {
      isEmail: true
    }
  },
  password: {
    type: Sequelize.STRING,
    allowNull: false,
    validate: {
      notEmpty: true
    }
  },
  isAdmin: {
    type: Sequelize.BOOLEAN,
    allowNull: false,
    defaultValue: false
  },
  isActive: {
    type: Sequelize.BOOLEAN,
    allowNull: false,
    defaultValue: false
  }

}, { tableName });

module.exports = User;

Модель client.js

'use strict'

const Sequelize = require('sequelize');
const db = require('../index.js');

const instanceMethods = {
  toJSON() {
    const values = Object.assign({}, this.get());

    return values;
  },
};

const Client = db.define('clients', {
  ibid: {
    type: Sequelize.BIGINT,
    allowNull: true,
    defaultValue: null
  },
  firstName: {
    type: Sequelize.STRING(50),
    allowNull: false,
    validate: {
      notEmpty: true
    }
  },
  lastName: {
    type: Sequelize.STRING(50),
    allowNull: false,
    validate: {
      notEmpty: true
    }
  },
  agreementSigned: {
    type: Sequelize.BOOLEAN,
    allowNull: false,
    defaultValue: false
  },
  totalBalance: {
    type: Sequelize.DECIMAL(11,2),
    allowNull: true,
    defaultValue: null
  },
  currentAllocation: {
    type: Sequelize.STRING,
    allowNull: true,
    defaultValue: null
  }

}, { instanceMethods });

module.exports = Client;

Модели index.js

'use strict';

const User = require('./user')
const Client = require('./client');

User.hasMany(Client);
Client.belongsTo(User);

module.exports = {User, Client};
  • 1
    В user.js вы не экспортируете user module.exports = User;
  • 0
    @ Молда. Извините, я не скопировал финальную часть файла, но да, я правильно экспортирую модель пользователя.
Теги:
express
sequelize.js

1 ответ

1

В index.js вы не экспортировали новый экземпляр sequelize, который вы инициализировали, и, следовательно, он недоступен для client.js и user.js! функция define работает над созданным вами экземпляром объекта sequelize!

Также в проекте существует круговая зависимость, которая может создать проблему!

Я попробовал ваш код и изменил структуру, и теперь он работает! Возможно, возможны и другие структуры, но это работает для меня!

1) Не создавайте новый экземпляр sequelize в index.js, а создавайте другой файл, который будет служить в качестве инициализации для экземпляра secelize!

sequelize_index.js (я использовал этот файл для создания базового экземпляра, а затем использовал этот базовый экземпляр как в клиентской, так и в пользовательской моделях)

const Sequelize = require('sequelize');
const dbconfig=require('./dbconfig.json');

const sequelize = new Sequelize('postgres://' + dbconfig.USER + ":" +     dbconfig.PASSWORD + "@" + dbconfig.HOST + ":5432/" + dbconfig.DB, {
host: dbconfig.HOST,
dialect: dbconfig.DIALECT,
pool: {
    min: 0,
    max: 5,
    idle: 1000
     }
});

 module.exports={sequelize};

2) Клиент.js будет выглядеть примерно так!

'use strict'
const Sequelize = require('sequelize');

const sequelize=require('./sequelize_index').sequelize;
const db = require('./index.js');

const instanceMethods = {
    toJSON() {
        const values = Object.assign({}, this.get());

        return values;
    },
};

const Client = sequelize.define('clients', {
    ibid: {
        type: Sequelize.BIGINT,
        allowNull: true,
        defaultValue: null
    },
    firstName: {
        type: Sequelize.STRING(50),
        allowNull: false,
        validate: {
            notEmpty: true
        }
    },
    lastName: {
        type: Sequelize.STRING(50),
        allowNull: false,
        validate: {
            notEmpty: true
        }
    },
    agreementSigned: {
        type: Sequelize.BOOLEAN,
        allowNull: false,
        defaultValue: false
    },
    totalBalance: {
        type: Sequelize.DECIMAL(11,2),
        allowNull: true,
        defaultValue: null
    },
    currentAllocation: {
        type: Sequelize.STRING,
        allowNull: true,
        defaultValue: null
    }

}, { instanceMethods });

module.exports = Client;

3) User.js

const Sequelize = require('sequelize');
const sequelize=require('./sequelize_index').sequelize;
const db = require('./index.js'); //This is an instance of new Sequelize(...)

const tableName = 'users';

const User = sequelize.define('user', {
    firstName: {
        type: Sequelize.STRING(50),
        allowNull: false,
        validate: {
            notEmpty: true
        }
    },
    lastName: {
        type: Sequelize.STRING(50),
        allowNull: false,
        validate: {
            notEmpty: true
        }
    },
    username: { //Username will be the email
        type: Sequelize.STRING(80),
        allowNull: false,
        unique: true,
        validate: {
            isEmail: true
        }
    },
    password: {
        type: Sequelize.STRING,
        allowNull: false,
        validate: {
            notEmpty: true
        }
    },
    isAdmin: {
        type: Sequelize.BOOLEAN,
        allowNull: false,
        defaultValue: false
    },
    isActive: {
        type: Sequelize.BOOLEAN,
        allowNull: false,
        defaultValue: false
    }

}, { tableName });

module.exports = User;

4) index.js

'use strict';
const sequelize = require('./sequelize_index').sequelize;
const User = require('./user')
const Client = require('./client');


User.hasMany(Client);
Client.belongsTo(User);

sequelize.sync({force: false}).then(function () {
    console.log("Database Configured");
});
module.exports = {User, Client};

После запуска index.js будет создана база данных!

  • 0
    Я хотел бы знать любые другие структуры, чтобы удалить круговую зависимость! Спасибо! :)
  • 0
    @Abhisek Yadav Спасибо за ваш ответ! Я могу решить это раньше. Я понял, что мне требуется моя БД, прежде чем использовать какую-либо модель (у меня был один файл аутентификации, который использует User, и я не включал БД раньше). Мне так не нравится, так что завтра я попробую по-твоему, это выглядит мило. Приветствую!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню