序列化:在操作符所在的位置调用获取方法

时间:2018-12-12 20:23:51

标签: javascript sequelize.js sequelize-typescript

我有一个带有IsBoolean字段的数据库。
IsBoolean可以是10
但是在Javascript / Typescript中,我有truefalse。比较方便。

我添加了getter以在Javascript中使用纯布尔值。
我添加了setter以将数据库转换为0/1。

型号:

const Employee = function(sequelize, DataTypes) {
    return sequelize.define('employee', {
        // ...Id...
        IsBoolean: {
            type: DataTypes.INTEGER, // Bit: 0 or 1
            allowNull: false,
            get() {
                const value = this.getDataValue('IsBoolean');
                return !!value; // from number to boolean
            },
            set(value) {
                // from boolean to number
                this.setDataValue('IsBoolean', +value);
            },
        },
    }, {
        tableName: 'employee'
    });
};

现在我搜索实例:

Employee.findOne(
    {
        where: {
            // getter is not being invoked
            // IsBoolean: true, // doesn't work, Conversion failed
            IsBoolean: 1, // works because I pass number
        },
    },
).then((data) => {
    const result = data.get({ plain: true }); // getter works
});

// setter works
Employee.update(
        { IsBoolean: false },
        { where: {Id: 100} },
);

当我使用get({ plain: true })时,Getter可以工作。
设置器适用于update(..)操作。
但是getter在where(和另一个运算符)中不起作用。

有什么方法可以在where内部激发吸气剂?


作为变体,我可以使用BeforeFind钩子:

function propagateRequired(instance) {
    instance.where.IsBoolean = !!instance.where.IsBoolean;
}

hooks: {
  beforeFind: propagateRequired
}

但是我认为这太困难了。

1 个答案:

答案 0 :(得分:0)

结果,我使用了beforeFind钩子

var element = document.getElementById('div-to-render');
html2canvas(element, { allowTaint : true }).then((canvas) =>
{
  canvas.getContext('2d');
  var image = canvas.toDataURL('image/jpeg', 1.0);
});

对于getter / setter来说,我可以使用

    模型选项中的
  • function propagateRequired(instance) { // or add another operators (in, like) instance.where.IsBoolean = !!instance.where.IsBoolean; } hooks: { beforeFind: propagateRequired } getterMethods

  • 或在每个字段定义中获取/设置(请参阅我的问题)。