Ошибка в таблицах ассоциации при секвенировании с узлом

#sequelize-cli

#исправлять cli

Вопрос:

я пытаюсь объединить таблицы в node sequelize.попробуйте получить данные из этих двух таблиц, но они не работают должным образом, я думаю, что некоторые проблемы в моем коде, пожалуйста, помогите мне решить эти проблемы с помощью Linux mint. начал node sequelize через несколько дней.теперь используется база данных postgres

 emploee table
const Sequelize = require("sequelize");
const db = require("../config/database");
const dataType = db.sequelize;
const Employee = dataType.define("employee", {
  id: {
    type: Sequelize.INTEGER,
    primaryKey: true,
    autoIncrement: true
  },
  username: {
    type: Sequelize.STRING,
  },
  password: {
    type: Sequelize.STRING
  },
  employeename:{
    type:Sequelize.STRING
  },
});
module.exports = Employee;
  

таблица пользователя

 const Sequelize = require("sequelize"); //use sequelize
 const db=require("../config/database"); //connect sequelize 
const dataType = db.sequelize;
const User = dataType.define("user",{  //table name
   id:{
       type:Sequelize.INTEGER,     //crete columns
       autoIncrement:true,
       primaryKey:true
   },
   username:{
        type:Sequelize.STRING
   },
   email:{
       type:Sequelize.STRING
   }

});
module.exports = User;    //export table 
  

service.js

  exports.views= req =>{
    console.log("enterd get service",req.body);
    return User.findAll({
      include:[
        {
          model:Employee
        }
      ]
    }).then(User =>{
      console.log("user data is=",User);
      const resobj= User.map(user=>{
        return Object.assign(
          {},
          {
            email:User.email,
            sarath:user.sarath.map(Employee=>{
              return Object.assign(
                {},
                {


                  username:Employee.username,
                  employeename:Employee.employeename,
                }
              )
            })

          }
        )
      });
      return resobj;

    }).catch(err=>{
      return console.log("ERR IS",err);
    });

  };
  

продолжить

 const Sequelize = require("sequelize");
// const Op = Sequelize.Op;
const Op=Sequelize.Op;
const sequelize = new Sequelize(
  "postgres", //db name
  "postgres", //username
  "postgres", //password

  {
    host: "localhost",
    dialect: "postgres",
    // operatorsAliases: false,
    opertorsAliases:{
       $or:Op.or
    },
    pool: {
      max: 5,
      min: 0,
      require: 30000,
      idle: 1000
    },
    define: {
      freezeTableName: true
    }
  }
);
// define model/table
const models = {
  Employee: sequelize.define("../model/employee"),
  User:sequelize.define("../model/user")
};

//relations
models.Employee.hasMany(models.User);



models.Sequelize = Sequelize;
models.sequelize = sequelize;



module.exports = models;
  

это мой вывод vs code

 enterd get service {}
ERR IS { SequelizeEagerLoadingError: employee is not associated to user!
    at Function._getIncludedAssociation (/home/sarath/Desktop/asset/node_modules/sequelize/lib/model.js:711:13)
    at Function._validateIncludedElement (/home/sarath/Desktop/asset/node_modules/sequelize/lib/model.js:615:53)
    at options.include.options.include.map.include (/home/sarath/Desktop/asset/node_modules/sequelize/lib/model.js:511:37)
    at Array.map (<anonymous>)
    at Function._validateIncludedElements (/home/sarath/Desktop/asset/node_modules/sequelize/lib/model.js:506:39)
    at Promise.try.then.then (/home/sarath/Desktop/asset/node_modules/sequelize/lib/model.js:1711:14)
    at tryCatcher (/home/sarath/Desktop/asset/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/home/sarath/Desktop/asset/node_modules/bluebird/js/release/promise.js:512:31)
    at Promise._settlePromise (/home/sarath/Desktop/asset/node_modules/bluebird/js/release/promise.js:569:18)
    at Promise._settlePromise0 (/home/sarath/Desktop/asset/node_modules/bluebird/js/release/promise.js:614:10)
    at Promise._settlePromises (/home/sarath/Desktop/asset/node_modules/bluebird/js/release/promise.js:694:18)
    at _drainQueueStep (/home/sarath/Desktop/asset/node_modules/bluebird/js/release/async.js:138:12)
    at _drainQueue (/home/sarath/Desktop/asset/node_modules/bluebird/js/release/async.js:131:9)
    at Async._drainQueues (/home/sarath/Desktop/asset/node_modules/bluebird/js/release/async.js:147:5)
    at Immediate.Async.drainQueues [as _onImmediate] (/home/sarath/Desktop/asset/node_modules/bluebird/js/release/async.js:17:14)
    at processImmediate (timers.js:632:19) name: 'SequelizeEagerLoadingError' }
GET /abc/users 200 20.215 ms - 57
  

Ответ №1:

я думаю, вам может быть проще, если вы объявите свои ассоциации в своих классах в соответствии с документацией.. но вам придется добавить кое-что, чтобы заставить его работать..

Я действительно не понимаю, почему между сотрудником и пользователем может быть много отношений, в ваших моделях нет ничего, что указывало бы на это… Ваши модели предполагают, что пользователь принадлежит сотруднику, а у сотрудника есть один пользователь, но поскольку это не идентификатор внешнего ключа, вам нужно будет указать sequelize, какие ключи использовать для создания ассоциации…

Может быть, что-то вроде

 module.exports = function (sequelize, DataTypes) {
  const Employee = sequelize.define('employee', {
      id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
      username: {
        type: Sequelize.STRING,
      },
      password: {
        type: Sequelize.STRING
      },
      employeename:{
        type:Sequelize.STRING
      },
    },
  }, {
    freezeTableName: true,
    tableName: 'employee',
  });

  Employee.associate = function (models) {
    models.Employee.hasOne(models.User, { as: 'Employee', foreignKey: 'username', sourceKey: 'username' });    
  };

  return Employee;
};

module.exports = function (sequelize, DataTypes) {
  const User = sequelize.define('user', {
       id:{
           type:Sequelize.INTEGER,     //crete columns
           autoIncrement:true,
           primaryKey:true
       },
       username:{
            type:Sequelize.STRING
       },
       email:{
           type:Sequelize.STRING
       }
    },
  }, {
    freezeTableName: true,
    tableName: 'user',
  });

  User.associate = function (models) {
    models.User.belongsTo(models.Employee, { as: 'User', foreignKey: 'username', sourceKey: 'username' });    
  };

  return User;
};
  

и затем, где вы это сделали: вам нужно добавить часть, которой вам не хватало

 // define model/table
const models = {
  Employee: sequelize.import('../model/employee'),
  User:sequelize.import('../model/user')
};

//You were missing this
Object.keys(models).forEach((modelName) => {
  if ('associate' in models[modelName]) {
    // console.log(models[modelName]);
    models[modelName].associate(models);
  }
});

models.Sequelize = Sequelize;
models.sequelize = sequelize;
  

Я сомневаюсь, что вы можете скопировать и вставить это и заставить его работать без нескольких исправлений, поскольку я только что ввел его здесь и не проверял в VSCode, но в этом суть..

Комментарии:

1. ОШИБКА РАВНА { SequelizeEagerLoadingError: сотрудник не связан с пользователем! в функции. _getIncludedAssociation

2. Объект.ключи (модели). forEach((Employee) => { if (‘associate’ в моделях[User]) { // console.log(модели[имямоДели]); модели[Employee].associate(это. Пользователь); } });

3. }); User.associate = функция (модели) { models.User.belongsTo(модели. Employee, { как: ‘User’, ForeignKey: ‘username’, sourceKey: ‘username’ }); }; module.exports = User; //экспортировать таблицу

4. Employee.associate = функция (модели) { модели. Сотрудник. Принадлежит (моделям. Пользователь, { как: ‘Employee’, ForeignKey: ‘username’, sourceKey: ‘username’ }); }; module.exports = Employee;

5. Это не сработает, вам придется пересмотреть то, что я сказал, и следить более внимательно… у вас есть несколько отношений belongsTo, а не отношения hasOne и belongsTo, которые я опубликовал выше… Также вы не должны публиковать код в комментариях… Вы должны опубликовать его полностью в правильно отформатированном ответе, так вам будет легче помочь! Просто опубликуйте другой ответ на вопрос с внесенными вами обновлениями или вернитесь и отредактируйте свой первый вопрос с внесенными вами изменениями, и я прочитаю его там