Необработанное отклонение SequelizeEagerLoadingError: не связано и не может прочитать свойство 'getTableName' из неопределенного - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть 3 таблицы: пользователь, поездка, authoriseDate. вот партнер: У пользователя много поездок, а у пользователя одна authoriseDate Пользователь один на много поездок Пользователь один на один authoriseDate а вот и модели Пользователь

 module.exports = (sequelize, DataTypes) => {
  const user = sequelize.define('User', {
    id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
    email: { type: DataTypes.STRING(50), unique: true },
    phoneNumber: {
      type: DataTypes.STRING(12), unique: true,
    },
  }, {
    classMethods: {
      associate(models) {
        // associations can be defined here
        user.hasOne(models.authoriseDate, { foreignKey: 'userId' });
        user.hasMany(models.Trip, { foreignKey: 'userId' });
      },
    },
  });
  return user;
};

Trip

module.exports = (sequelize, DataTypes) => {
  const trip = sequelize.define('Trip', {
    id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
    userId: DataTypes.INTEGER,
    status: DataTypes.INTEGER,
  }, {
    classMethods: {
      associate(models) {
        // associations can be defined here
        trip.belongsTo(models.User, { foreignKey: 'userId' });
      },
    },
  });
  return trip;
};

authoriseDate

module.exports = (sequelize, DataTypes) => {
  const authoriseDate = sequelize.define('AuthoriseDate', {
    id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
    userId: DataTypes.INTEGER,
    lastAuthorise: DataTypes.DATE,
  }, {
    classMethods: {
      associate(models) {
        // associations can be defined here
        authoriseDate.belongsTo(models.User, { foreignKey: 'userId', });
      },
    },
  });
  return authoriseDate;
};

но когда я использую функцию findAll

models.User.findAll({
    include: [{
      model: models.Trip,
    },
    {
      model: models.authoriseDate,
    }],
  })

вот мой файл модели

    'use strict';

var fs = require('fs');
var path = require('path');
var Sequelize = require('sequelize');
var basename = path.basename(module.filename);
//var env = process.env.NODE_ENV || 'development';
//var config    = require(__dirname + './../../../config/config.json')[env];
var config = require('../../config/env')
var db = {};

// if (config.use_env_variable) {
//   var sequelize = new Sequelize(process.env[config.use_env_variable]);
// } else {
//   var sequelize = new Sequelize(config.database, config.username, config.password, config);
// }

var sequelize = new Sequelize(config.dbName, config.dbUserName, config.dbPassword, {
  host: config.dbHost,
  dialect: config.dbDialect,
});

fs
  .readdirSync(__dirname)
  .filter(function (file) {
    return (file.indexOf('.') !== 0) && (file !== basename);
  })
  .forEach(function (file) {
    if (file.slice(-3) !== '.js') return;
    var model = sequelize['import'](path.join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach(function (modelName) {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

Я получаю ошибки: Необработанное отклонение SequelizeEagerLoadingError: Trip не связан с пользователем и не может прочитать свойство 'getTableName' из неопределенного Я не знаю, как решить эти ошибки, кто-нибудь, помогите мне, пожалуйста

1 Ответ

0 голосов
/ 03 сентября 2018

Вам необходимо вызвать функцию-ассоциированного.

Пример:

Модель AuthoriseDate

module.exports = (sequelize, DataTypes) => {
    const authoriseDate = sequelize.define('AuthoriseDate', {
        id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
        userId: DataTypes.INTEGER,
        lastAuthorise: DataTypes.DATE,
    });

    authoriseDate.associate = (models) => {
        // associations can be defined here
        authoriseDate.belongsTo(models.User, { foreignKey: 'userId', });
    };


    return authoriseDate;
};

Модель поездки

module.exports = (sequelize, DataTypes) => {
    const trip = sequelize.define('Trip', {
        id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
        userId: DataTypes.INTEGER,
        status: DataTypes.INTEGER,
    });

    trip.associate = (models) => {
        // associations can be defined here
        trip.belongsTo(models.User, { foreignKey: 'userId' });
    };

    return trip;
};

Модель пользователя

module.exports = (sequelize, DataTypes) => {
    const user = sequelize.define('User', {
        id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
        email: { type: DataTypes.STRING(50), unique: true },
        phoneNumber: {
            type: DataTypes.STRING(12), unique: true,
        },
    });

    user.associate = (models) => {
        // associations can be defined here
        user.hasOne(models.AuthoriseDate, { foreignKey: 'userId' });
        user.hasMany(models.Trip, { foreignKey: 'userId' });
    };


    return user;
};

init модели

'use strict';

var fs = require('fs');
var path = require('path');
var Sequelize = require('sequelize');
var basename = path.basename(module.filename);
//var env = process.env.NODE_ENV || 'development';
//var config    = require(__dirname + './../../../config/config.json')[env];
// var config = require('../../config/env')
var db = {};

var sequelize = new Sequelize('test_01', 'root', 'root', {
    host: 'localhost',
    dialect: 'mysql',
});

fs
    .readdirSync(__dirname)
    .filter(function (file) {
        return (file.indexOf('.') !== 0) && (file !== basename);
    })
    .forEach(function (file) {
        if (file.slice(-3) !== '.js') return;
        var model = sequelize['import'](path.join(__dirname, file));
        db[model.name] = model;
    });

console.log(db);

Object.keys(db).forEach((modelName) => {
    if (db[modelName].associate) {
        db[modelName].associate(db);
    }
});

(async () => {
    await sequelize.sync();
})();

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

использовать находку

(async () => {
    const models = require('./models');

    const users = await models.User.findAll({
        include: [
            {
                model: models.Trip,
            },
            {
                model: models.AuthoriseDate,
            },
        ],
    });

    console.log(users);
})();

http://docs.sequelizejs.com/manual/tutorial/associations.html

...