在帆中使用“基本模型”,从中派生并使用基本类函数?

时间:2018-09-30 23:03:30

标签: javascript sails.js lodash dry derived-class

为改进程序并减少代码冗余,我们希望在模型内部创建一些继承。.

现在采用典型的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()?)。

2 个答案:

答案 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()