я пытаюсь соединить таблицы в узле sequenceize.try, чтобы получить данные из этих двух таблиц, но они не работают должным образом, я думаю, что некоторые проблемы в моем коде, пожалуйста, помогите мне решить эти проблемы с помощью линукс минт. через несколько дней началось продолжение узла. Теперь с использованием базы данных 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
сервис.js
exports.views= req =>{
console.info("enterd get service",req.body);
return User.findAll({
include:[
{
model:Employee
}
]
}).then(User =>{
console.info("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.info("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
я думаю, вам будет проще, если вы объявите свои ассоциации в своих классах в соответствии с документацией.. но вам придется добавить кое-что, чтобы заставить его работать..
Я действительно не понимаю, почему между Сотрудником и Пользователем может быть отношение hasMany, в ваших моделях нет ничего, что предполагало бы это... Ваши модели предполагают, что Пользователь принадлежит Сотруднику, а Сотрудник имеет одного пользователя, но потому что это не так. идентификатор внешнего ключа, который вам нужно будет указать, какие ключи использовать для создания ассоциации...
Может что-то в духе
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.info(models[modelName]);
models[modelName].associate(models);
}
});
models.Sequelize = Sequelize;
models.sequelize = sequelize;
Я сомневаюсь, что вы можете скопировать и вставить это и заставить его работать без нескольких исправлений, поскольку я просто набрал его здесь и не проверял в VSCode, но это суть.
Object.keys(models).forEach((Employee) => { if ('associate' in models[User]) { // console.info(models[modelName]); models[Employee].associate(this.User) ; } });
}); User.associate = function (models) { models.User.belongsTo(models.Employee, { as: 'Пользователь', ForeignKey: 'имя пользователя', sourceKey: 'имя пользователя'}); }; модуль.экспорт = Пользователь; // экспорт таблицы
Employee.associate = function (models) { models.Employee.belongsTo(models.User, { as: 'Сотрудник', ForeignKey: 'имя пользователя', sourceKey: 'имя пользователя'}); }; модуль.экспорт = Сотрудник;
Это не сработает, вам придется пересмотреть то, что я сказал, и следовать более внимательно... у вас есть несколько отношений ownTo, а не отношения hasOne и ownTo, которые я разместил выше... Также вы не должны публиковать код в комментариях. .. Вы должны опубликовать его полностью в правильно отформатированном ответе, так вам будет легче помочь! Просто опубликуйте еще один ответ на вопрос с внесенными вами обновлениями или вернитесь и отредактируйте свой первый вопрос с внесенными вами изменениями, и я прочитаю его там.
Кроме того, ваш forEach еще не выглядит правильно, вам нужно пропустить через него все свои модели, так как отношения имеют 2 стороны.
часть hasOne была моей ошибкой, я говорил об этом выше кода, который я написал, но в спешке они оба были написаны как ownTo в коде, я исправил это
ERR IS { SequelizeEagerLoadingError: сотрудник не связан с пользователем! в Function._getIncludedAssociation