我可以覆盖/扩展Meteor方法吗?

时间:2015-05-07 15:31:43

标签: meteor

是否有可能以某种方式覆盖Meteor中的方法? 或者定义另一个函数,以便两个都会被调用?

在我的常规代码中:

Meteor.methods(
   foo: (parameters) ->
      bar(parameters)
)

以后加载的其他地方(例如在tests中):

Meteor.methods(
   # override
   foo: (parameters) ->
      differentBehavior(parameters)
      # I could call some super() here
)

所以我希望要么bardifferentBehavior都执行,要么只有differentBehavior,并且有可能调用super()

这是否存在?

2 个答案:

答案 0 :(得分:4)

要覆盖方法,可以在服务器端执行以下操作:

Meteor.methods({
   'method_name': function () {
       //old method definition
   }
});

Meteor.default_server.method_handlers['method_name'] = function (args) {
    //put your new code here
};

方法定义后必须包含Meteor.default_server.method_handlers['method_name']

要覆盖方法(也称为存根),在客户端可以执行以下操作:

Meteor.connection._methodHandlers['method_name'] = function (args) {
    //put your new code here
};

方法定义后必须包含Meteor.connection._methodHandlers['method_name']

答案 1 :(得分:2)

有很多方法可以做你想做的事。

例如,覆盖任何函数的最简单方法是执行以下操作:

Meteor.publish = function() { /* My custom function code */ };

我们用我们自己的实例覆盖了Meteor.publish。

但是,如果你想包装像代理一样的函数(我相信这被称为“代理模式”:

var oldPublish = Meteor.publish();
Meteor.publish = function() {
  oldPublish(arguments);   // Call old JS with arguments passed in
}

ES6还添加了一个Proxy对象,允许您执行类似的操作(阅读here)。

此外,还有很多AOP个库(CujoJSjQuery-AOPnode-aop等等)可以让您在之前,之后,周围进行JavaScript函数/对象上的切入点。如果你也愿意,你甚至可以自己动手。