为改进程序并减少代码冗余,我们希望在模型内部创建一些继承。.
现在采用典型的User
模型,它具有名称和密码字段作为“基类”,并且根据特定应用程序的需要,几个子类可以对此进行改进。
所以基本用户看起来像:
module.exports = {
attributes: {
username: {
type: 'string',
required: true,
unique: true
},
password: {
type: 'string',
required: true,
},
},
beforeCreate: async function(user, cb) {
const hash = await bcrypt.hash(user.password, 10);
user.password = hash;
cb();
},
}
这个裸类本身不对应任何数据库表。现在,从VerifyableUser
(必须具有验证链接的用户模型)的派生类中,有一些额外的字段,其中一个是验证URL。
如this question所述,现在使用“扩展”类lodash的_.merge
函数。
const BaseUser = require("../../BaseUser.js");
module.exports = _.merge({}, BaseUser, {
attributes: {
verify_key: {
type: 'string'
}
},
beforeCreate: async function(user, cb) {
user.verify_key = 'helloworld'; //crypto used to generate...
cb();
}
};
现在问题应该很明显,派生类的beforeCreate
会覆盖原始的beforeCreate
:在普通的OO环境中,这也不是什么大问题,因为我可以称之为{{1 }}或类似的东西。
但是可以使用lodash合并来完成某些事情吗?还是应该使用另一种方式扩展对象? (还是我真的必须重复自己并重新输入Base.beforeCreate()
?)。
答案 0 :(得分:0)
或类似的内容:
// VerifyableUser
async beforeCreate(user, cb) {
await BaseUser.beforeCreate(user, () => 0);
//...
}
答案 1 :(得分:0)
您还可以使用 https://docs.marklogic.com/guide/app-dev/mod-docs 来检查要合并的每个属性是什么,如果它是一个函数,则仅选择对象而不是源(在您的情况下,{{1} }是source
):
BaseUser
这是一个测试:
const BaseUser = require("../../BaseUser.js");
let obj = {
attributes: {
verify_key: {
type: 'string'
}
},
beforeCreate: async function(user, cb) {
user.verify_key = 'helloworld'; //crypto used to generate...
cb();
}
}
module.exports = _.mergeWith(
obj,
BaseUser,
(objValue, srcValue, key, object, source) => _.isFunction(objValue) ? objValue : _.merge(object[key], source[key])
)
var data = {
food: "chicken",
foo: () => console.log('chicken!')
}
var source = {
prop1: 1,
prop2: 1,
foo: () => console.log('foo!')
}
var result = _.merge(data, source, (objValue, srcValue, key, object, source) => _.isFunction(objValue) ? objValue : _.merge(object[key], source[key]))
console.log(result)
result.foo()