如何扩展Sequelize模型?

时间:2017-11-28 09:38:26

标签: javascript express ecmascript-6 sequelize.js feathersjs

有没有办法可以使用一个基类,它具有我的模型的所有公共属性和方法,但没有与数据库表链接,然后我可以在定义新模型时扩展这个基类。

这里我在node express中创建了基础人物模型。我需要从基类扩展person类。

ANDROID_API_LEVELS

在文件中,它说明了

  

Sequelize Models是ES6类。您可以非常轻松地添加自定义实例或类级别方法。

如何使用ES6扩展类模式?

有类似的问题,但最近没有更新。 http://blogs.microsoft.co.il/sasha/2012/04/04/what-anycpu-really-means-as-of-net-45-and-visual-studio-11/

2 个答案:

答案 0 :(得分:4)

  

如何使用ES6扩展类模式?

Sequelize docs中的陈述对开发人员来说有点混乱。这并不意味着您可以使用ES6类语法扩展已定义的模型,如下所示。

const User = db.define('User', {
  name: sequelize.STRING,
  age: sequelize.INTEGER
});

// This is impossible.
class Staff extends User {
  ...
}

但您可以通过访问下面的原型来定义实例方法。

const User = db.define('User', {
  name: sequelize.STRING,
  age: sequelize.INTEGER
});

User.Instance.prototype.test = function() {
  return `Name: ${this.name}, Age: ${this.age}`
}

User.create({ name: "John", age: 10 });
User.findOne().then((user) => {
  console.log(user.test()) // "Name: John, Age: 10"
});

你在Sequelize doc中提到的声明实际上是说你可以使用基于原型的扩展来增强模型行为,所以你不能做你尝试在问题中做的模型继承。

在Sequelize中有很多关于ES6类语法的实现建议的讨论,如{{3}},但它仍在讨论中。

答案 1 :(得分:1)

似乎使用Sequelize无法扩展类模型,那么如何扩展sequelize对象的config对象呢?这是更多的工作,但提供了最接近的体验,并且仍然相对干净。当然,同时使用attributesoptions参数需要使用2个单独的类或对组合类进行适当的分解。

class Base {
    constructor() {
        this.id = {
            type: Sequelize.INTEGER,
            autoIncrement: true,
            primaryKey: true
        };
        ...
    }
}

class Person extends Base {
    constructor() {
        super();
        this.name = {
            type: DataTypes.STRING,
            allowNull: false
        };
        ...
    }
}

// using separate class for attributes
const person = sequelize.define('person', new Person());

// possible destructuring of attributes/options
const someModel= sequelize.define('someModel', (new SomeModel()).attributes, (new SomeModel()).options);