Sequelize.js afterUpdate hook传递更改的值

时间:2013-11-19 22:02:11

标签: javascript node.js sequelize.js

我正在构建一个node.js应用程序,我正在为持久对象评估Sequelize.js。我需要做的一件事是在修改对象时发布新值。最明智的做法似乎是使用afterUpdate钩子。

它几乎完美无缺,但是当我保存一个对象时,钩子会传递所有已保存对象的值。通常这是可取的,但为了保持发布/订阅聊天,我宁愿不重新发布未保存的字段。

例如,运行以下

tasks[0].updateAttributes({assignee: 10}, ['assignee']);

会在相应的渠道上自动为该任务的受让人发布新值,但不会重新发布任何其他未更改的字段。

我最接近的是使用afterUpdate钩子:

Task.hook('afterUpdate', function(task, fn) {
    Object.keys(task).forEach(function publishValue(key) {
        pubSub.publish('Task:'+task.id+'#'+key, task[key]);
    });
    return fn();
});

这非常简单,但由于'task'对象具有所有字段,因此我不必要地吵闹。 (pubSub系统不知道以前的值,我想保持这种方式。)

我可以覆盖任务对象(以及我所有其他对象)中的setter,但我希望在保存对象之前不要发布。要保存的对象似乎没有旧的值(我可以找到),所以我不能将我的发布作为基础。

到目前为止,我从设计角度提出的最佳答案是调整一行dao.js以将保存的值添加到返回的对象中,并在钩子中使用它:

self.__factory.runHooks('after' + hook, _.extend({}, result.values, {savedVals: args[2]} ), function(err, newValues) {


Task.hook('afterUpdate', function(task, fn) {
    Object.keys(task.savedVals).forEach(function publishValue(key) {
        pubSub.publish('Task:'+task.id+'#'+key, task[key]);
    });
    return fn();
});

从维护的角度来看,显然更改Sequelize库并不理想。

所以我的问题是双重的:有没有更好的方法可以在不修改dao.js的情况下将所需信息提供给我的钩子,还是有更好的方法来攻击我的基本要求?

提前致谢!

1 个答案:

答案 0 :(得分:0)

目前没有。在您所描述的实现中,我们只需要实现逻辑来比较旧值和新值,如果它们不同,则假设它们已经发生了变化。