添加自己的缓存中间件以Sequelize Query原型

时间:2019-02-01 06:36:32

标签: javascript node.js sequelize.js

有一个带有Sequelize ORM(PostgreSQL)的Node.js项目,需要在Redis中缓存所有接收到的数据。我想做一些类似中间件的事情,即原型cache()中的一个函数,用于在丢失时进行缓存或不做。

赞:

let section = await Section.findAll({
            where: {active: true},
            attributes: ['id', 'title'],
            include: [{model: Page, as: 'items', attributes: ['id', 'title', 'action', 'active']}]
        }).cache({ options... });

例如在猫鼬中,原型中有Query对象和exec函数,我可以在Sequelize中做同样的事情吗?

我正在查看Sequelize项目的github源码,但在其中找不到运行查询的exec / endpoint方法的类似物... Model obj及其findAllfindOne之类的函数已经返回了promise,而没有任何exec()

这是猫鼬实现的例子

...

const exec = mongoose.Query.prototype.exec;

mongoose.Query.prototype.cache = function(options = {}) {
    this.useCache = true;

    this.hashKey = JSON.stringify(options.key || '');

    return this;
};

mongoose.Query.prototype.exec = async function () {

    if (!this.useCache) {
        return exec.apply(this, arguments);
    }

    const key = JSON.stringify(
        Object.assign({}, this.getQuery, {
            collection: this.mongooseCollection.name
        })
    );

    const cacheValue = await client.hget(this.hashKey, key);

    if (cacheValue) {
        const doc = JSON.parse(cacheValue);

        return Array.isArray(doc)
            ? doc.map(d => new this.model(d))
            : new this.model(doc);
    }

    const result = exec.apply(this, arguments);

    client.hset(this.hashKey, key, JSON.stringify(result), 'EX', 10);

    return result;
};

我专门为findAll做一些原型函数,但是在重载findAll内如何创建当前模型的实例时遇到了一些问题

Sequelize.prototype.Model.findAll = async function () {

    if (!this.useCache) {
        return query.apply(this, arguments);
    }

    const key = JSON.stringify(
        Object.assign({}, {
            collection: this.name
        })
    );

    const cacheValue = await client.get(this.hashKey);

    if (cacheValue) {
        const doc = JSON.parse(cacheValue);

        return Array.isArray(doc)
            ? doc.map(d => this.build(d))  ---????---
            : this.build(doc);             ---????---
    }

    const result = query.apply(this, arguments);

    client.set(this.hashKey, JSON.stringify(result));

    return result;
};

可能有一些数据包可以做到这一点,或者有现成的解决方案吗?

0 个答案:

没有答案