未创建的 Sequelize 关联
Sequelize Associations not being created
我正在设计一个有人和用户的系统(所有的用户都是人,但不是所有的人都是用户)。这些实体中的每一个都可以有多个电子邮件。 Sequelize 模型设置如下:
型号
人
module.exports = function(sequelize, Sequelize) {
var Person = sequelize.define('person', {
id: {
type: Sequelize.UUID,
primaryKey: true
},
firstName: {
type: Sequelize.STRING,
allowNull: false
},
lastName: {
type: Sequelize.STRING,
allowNull: false
},
middleName: {
type: Sequelize.STRING
},
dob: {
type: Sequelize.DATE
}
});
return Person;
};
公司
module.exports = function (sequelize, Sequelize) {
var Company = sequelize.define('company', {
id: {
type: Sequelize.UUID,
primaryKey: true
},
name: {
type: Sequelize.STRING,
allowNull: false
},
description: {
type: Sequelize.TEXT
},
status: {
type: Sequelize.ENUM('ACTIVE', 'INACTIVE'),
defaultValue: 'ACTIVE'
}
});
return Company;
};
用户
module.exports = function (sequelize, Sequelize) {
var User = sequelize.define('user', {
id: {
type: Sequelize.UUID,
primaryKey: true
},
username: {
type: Sequelize.STRING,
allowNull: false
},
password: {
type: Sequelize.STRING,
allowNull: false
},
salt: {
type: Sequelize.STRING(128),
allowNull: true
}
});
return User;
};
电子邮件
module.exports = function(sequelize, Sequelize) {
var Email = sequelize.define('email', {
id: {
type: Sequelize.UUID,
primaryKey: true
},
address: {
type: Sequelize.STRING,
allowNull: false
},
status: {
type: Sequelize.ENUM('ACTIVE','INACTIVE'),
allowNull: false,
defaultValue: 'ACTIVE'
}
});
return Email;
};
关系
module.exports = function(models) {
models.Company.belongsToMany(models.User, {through: 'companiesUsers'});
models.Email.belongsToMany(models.Person, {through: 'peopleEmails'});
models.Email.belongsToMany(models.User, {through: 'usersEmails'});
models.Person.belongsToMany(models.Email, {through: 'peopleEmails'});
models.User.belongsToMany(models.Company, {through: 'companiesUsers'});
models.User.belongsToMany(models.Email, {through: 'usersEmails'});
};
服务
module.exports = function (models, uuid, q, sequelize) {
var crypto = require('crypto');
function register(attrs) {
var salt = crypto.randomBytes(128).toString('base64').substr(0, 128),
hash = crypto.createHash('sha1'),
hashedPassword,
user,
company,
person,
deferred = q.defer(),
result = {};
hash.update(attrs.password + salt, 'utf8');
hashedPassword = hash.digest('base64');
sequelize.transaction(function(t) {
return models.User.create({
id: uuid.v4(),
username: attrs.username,
password: hashedPassword,
salt: salt
}).then(function(createdUser) {
user = createdUser;
result.user = user.dataValues;
return models.Company.create({
id: uuid.v4(),
name: attrs.companyName,
description: attrs.companyDescription || null,
status: 'ACTIVE'
});
}).then(function(createdCompany) {
company = createdCompany;
result.company = createdCompany.dataValues;
company.addUser(user);
return models.Person.create({
id: uuid.v4(),
firstName: attrs.firstName,
lastName: attrs.lastName,
middleName: attrs.middleName || null,
userId: user.id
});
}).then(function(createdPerson) {
person = createdPerson;
result.person = createdPerson.dataValues;
return models.Email.create({
id: uuid.v4(),
address: attrs.emailAddress,
status: 'ACTIVE'
});
}).then(function(email) {
email.addPerson(person);
});
}).then(function() {
deferred.resolve(result);
}).catch(function(err) {
deferred.reject(err);
});
return deferred.promise;
}
return {
register: register
}
};
结果
服务执行没有错误,并且 companiesUsers
连接实体创建得很好,但是 email.addPerson()
和 person.addEmail()
都不会创建 peopleEmails
连接实体。
我不太确定我能做些什么不同的事情,但我真的很喜欢 Sequelize,并且不愿意用另一个库重做我的 ORM,因为我已经投入了很多时间!
谢谢!
不确定这是否有帮助,但也许您需要在 email.addPerson(人)之前添加一个 return?否则,promise 可能 "finish" 在此步骤完成之前,您将错过电子邮件-人员关联。
then(function(email) {
return email.addPerson(person);
^^^^^^ this was missing
});
我正在设计一个有人和用户的系统(所有的用户都是人,但不是所有的人都是用户)。这些实体中的每一个都可以有多个电子邮件。 Sequelize 模型设置如下:
型号
人
module.exports = function(sequelize, Sequelize) {
var Person = sequelize.define('person', {
id: {
type: Sequelize.UUID,
primaryKey: true
},
firstName: {
type: Sequelize.STRING,
allowNull: false
},
lastName: {
type: Sequelize.STRING,
allowNull: false
},
middleName: {
type: Sequelize.STRING
},
dob: {
type: Sequelize.DATE
}
});
return Person;
};
公司
module.exports = function (sequelize, Sequelize) {
var Company = sequelize.define('company', {
id: {
type: Sequelize.UUID,
primaryKey: true
},
name: {
type: Sequelize.STRING,
allowNull: false
},
description: {
type: Sequelize.TEXT
},
status: {
type: Sequelize.ENUM('ACTIVE', 'INACTIVE'),
defaultValue: 'ACTIVE'
}
});
return Company;
};
用户
module.exports = function (sequelize, Sequelize) {
var User = sequelize.define('user', {
id: {
type: Sequelize.UUID,
primaryKey: true
},
username: {
type: Sequelize.STRING,
allowNull: false
},
password: {
type: Sequelize.STRING,
allowNull: false
},
salt: {
type: Sequelize.STRING(128),
allowNull: true
}
});
return User;
};
电子邮件
module.exports = function(sequelize, Sequelize) {
var Email = sequelize.define('email', {
id: {
type: Sequelize.UUID,
primaryKey: true
},
address: {
type: Sequelize.STRING,
allowNull: false
},
status: {
type: Sequelize.ENUM('ACTIVE','INACTIVE'),
allowNull: false,
defaultValue: 'ACTIVE'
}
});
return Email;
};
关系
module.exports = function(models) {
models.Company.belongsToMany(models.User, {through: 'companiesUsers'});
models.Email.belongsToMany(models.Person, {through: 'peopleEmails'});
models.Email.belongsToMany(models.User, {through: 'usersEmails'});
models.Person.belongsToMany(models.Email, {through: 'peopleEmails'});
models.User.belongsToMany(models.Company, {through: 'companiesUsers'});
models.User.belongsToMany(models.Email, {through: 'usersEmails'});
};
服务
module.exports = function (models, uuid, q, sequelize) {
var crypto = require('crypto');
function register(attrs) {
var salt = crypto.randomBytes(128).toString('base64').substr(0, 128),
hash = crypto.createHash('sha1'),
hashedPassword,
user,
company,
person,
deferred = q.defer(),
result = {};
hash.update(attrs.password + salt, 'utf8');
hashedPassword = hash.digest('base64');
sequelize.transaction(function(t) {
return models.User.create({
id: uuid.v4(),
username: attrs.username,
password: hashedPassword,
salt: salt
}).then(function(createdUser) {
user = createdUser;
result.user = user.dataValues;
return models.Company.create({
id: uuid.v4(),
name: attrs.companyName,
description: attrs.companyDescription || null,
status: 'ACTIVE'
});
}).then(function(createdCompany) {
company = createdCompany;
result.company = createdCompany.dataValues;
company.addUser(user);
return models.Person.create({
id: uuid.v4(),
firstName: attrs.firstName,
lastName: attrs.lastName,
middleName: attrs.middleName || null,
userId: user.id
});
}).then(function(createdPerson) {
person = createdPerson;
result.person = createdPerson.dataValues;
return models.Email.create({
id: uuid.v4(),
address: attrs.emailAddress,
status: 'ACTIVE'
});
}).then(function(email) {
email.addPerson(person);
});
}).then(function() {
deferred.resolve(result);
}).catch(function(err) {
deferred.reject(err);
});
return deferred.promise;
}
return {
register: register
}
};
结果
服务执行没有错误,并且 companiesUsers
连接实体创建得很好,但是 email.addPerson()
和 person.addEmail()
都不会创建 peopleEmails
连接实体。
我不太确定我能做些什么不同的事情,但我真的很喜欢 Sequelize,并且不愿意用另一个库重做我的 ORM,因为我已经投入了很多时间!
谢谢!
不确定这是否有帮助,但也许您需要在 email.addPerson(人)之前添加一个 return?否则,promise 可能 "finish" 在此步骤完成之前,您将错过电子邮件-人员关联。
then(function(email) {
return email.addPerson(person);
^^^^^^ this was missing
});