Модель базы данных Sequelize возвращается как (функция [анонимно])

Я пытался найти маршрут из моих учетных записей моделей базы данных и собак:

db.Accounts.findAll({
            where: {
                admin:true,
            },
            include: [db.Dogs]
        }).then((dbAdminAcc) => res.json(dbAdminAcc));
    });

Но когда я пытаюсь запустить приложение и маршруты, оно продолжает возвращаться как: TypeError: Cannot read property 'findAll' of undefined. Поэтому, сделав несколько журналов консоли в index.js для папки моделей, я обнаружил, что все модели выводятся в консоли, поскольку модель [функция (анонимно)] для всех трех моделей. Это делает невозможным для меня доступ к данным вообще.

}).forEach((file) => {
      console.log('The file is', file)
      console.log(path.join(__dirname, file))
        const model = require(path.join(__dirname, file));
        console.log('Model is', model) // This is showing a function (anonymous instead of a name like Accounts)
        db[model.name] = model;
    });

    Object.keys(db).forEach((modelName) => {
      console.log('DB with modelname:', (db[modelName]))
        if(db[modelName].associate) {
            db[modelName].associate(db);
       

} });

Я посмотрел, правильный ли синтаксис в моделях Dogs и Accounts, чтобы увидеть, отсутствуют ли возвраты, но обе модели, похоже, настроены правильно:

module.exports = (sequelize, DataTypes) => {
    
    const Dogs = sequelize.define('Dogs', {
        dog_name: {
            type: DataTypes.STRING,
            allowNull: false,
            validate: {
                len: [2,15],
            },
        },
        breed: {
            type: DataTypes.STRING,
            allowNull: false,
            validate: {
                len: [2,15],
            },
        },
        age: {
            type: DataTypes.INTEGER,
            allowNull: false,
            validate: {
                len: [2,35],
            },
            isNumeric: true,
            isInt: true,
        },
        food_requirements: {
            type: DataTypes.STRING,
            allowNull: false,
            validate: {
                len: [2,200],
            },
        },
        friendliness: {
            type: DataTypes.INTEGER,
            allowNull: false,
            validate: {
                len: [1,5],
            },
            isNumeric: true,
            isInt: true,
        }, 
        
    });

    Dogs.associate = (models) => {
        // a Dogs must belong inside the Admin Account
        // Dogs cannot be created without a petId (username) 
        Dogs.belongsTo(models.Accounts, {
            foreignKey: {
                allowNull: false,
            },
        });
    };
    return Dogs;   
};

const bcrypt = require("bcryptjs");

module.exports = (sequelize, DataTypes) => {
    const Accounts = sequelize.define('Accounts', {
      username: {
        type: DataTypes.STRING,
        allowNull: false,
        unique: true,
        validate: {
          isUserName: true
        }
      },
      // The password cannot be null
      password: {
        type: DataTypes.STRING,
        allowNull: false
      },
      //this true or false 
      admin: {
        type: DataTypes.BOOLEAN,
        defaultValue: false,
      }
    });
    Accounts.associate = (models) => {
      Accounts.hasMany(models.Dogs, {
          onDelete: 'cascade'
      });
    };

 
  Accounts.prototype.validPassword = function(password) {
    return bcrypt.compareSync(password, this.password);
  };
 
  Accounts.addHook("beforeCreate", function(accounts) {
    Accounts.password = bcrypt.hashSync(accounts.password, bcrypt.genSaltSync(10), null);
  });
  
  return Accounts;
};

Я в недоумении, что попробовать дальше. Кто-нибудь знает, почему это происходит и как это исправить? Любая помощь будет принята с благодарностью. Спасибо


person GKFitz    schedule 28.02.2021    source источник
comment
Вам не хватает вызова функции с аргументами, т.е. functionName(arg1, arg2). Просто сделайте требование как const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);.   -  person Abhishek Shah    schedule 02.03.2021


Ответы (1)


Вы должны регистрировать модели с помощью функции Sequelize import, а не просто импортировать их с помощью require:

var model = sequelize['import'](path.join(models, file))
db[model.name] = model

UPD: этот метод import устарел, начиная с v6. Используйте подход @Abhishek, указанный в его комментарии. Посмотрите на мой ответ здесь

person Anatoly    schedule 28.02.2021
comment
Этот метод - sequelize.import устарел, начиная с версии 6+. - person Abhishek Shah; 02.03.2021
comment
Да, вы совершенно правы. Я добавлю это к своему ответу. Между тем вы можете создать свой ответ из комментария как более независимый от версии. - person Anatoly; 03.03.2021