sequlelize with node 中的关联表错误

Error in association tables in sequlelize with node

我正在尝试在节点 sequelize.try 中加入 tables 从这两个 tables 获取数据但是它不能正常工作我认为我的代码中存在一些问题请帮助我解决这个问题 使用 linux 薄荷糖。 使用 postgres 数据库

在几个 days.now 开始节点续集
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;

用户table

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 代码输出

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

我认为如果您按照文档在 类 中声明您的关联,对您来说可能会更容易..但是您必须添加一些东西才能使其正常工作..

我真的不明白为什么 Employee 和 User 之间会有 hasMany 关系,您的模型中没有任何内容表明...您的模型表明 User belongsTo Employee,而 Employee hasOne User 但是因为它不是外键 ID,所以你必须告诉 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 中检查它,但这是它的要点..