Ошибка в ассоциативных таблицах в сиквелизе с узлом - PullRequest
1 голос
/ 08 апреля 2019

я пытаюсь объединить таблицы в узле sequelize.try получить данные из этих двух таблиц, но он не работает должным образом, я думаю, что некоторые проблемы в моем коде, пожалуйста, помогите мне решить эту проблему используя Linux Mint. запустил секвелирование узла через несколько дней. Теперь, используя базу данных 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;

это мой вывод кода против

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 Ответ

0 голосов
/ 09 апреля 2019

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

Я не совсем понимаю, почему между Сотрудником и Пользователем существуют отношения hasMany, в ваших моделях нет ничего, что указывало бы на то, что ... Ваши модели предполагают, что Пользователь принадлежит Сотруднику, а Сотрудник имеет одного Пользователя, но только потому, что не с помощью идентификатора внешнего ключа, вы должны указать 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, но это суть ..

...