有一个带有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及其findAll
,findOne
之类的函数已经返回了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;
};
可能有一些数据包可以做到这一点,或者有现成的解决方案吗?