获取Meteor方法返回函数?

时间:2014-08-23 10:08:57

标签: meteor

我想定义一个服务器端的Meteor方法,当被调用时,它将在客户端上运行一个函数。

下面的简单示例 - 我希望此方法获取参数,并且在调用时,将在客户端控制台上运行console.log(parameter)

Meteor.methods({

    consoleLogOnClient: function(text){
        var log = function(){ 
            console.log(text);
        };
        return log();
    }

});

但是当我这样做时:

Meteor.call('consoleLogOnClient', 'THIS MESSAGE SHOULD APPEAR ON THE CLIENT CONSOLE');

消息将记录在服务器控制台中,并且客户端控制台中不会显示任何内容。

好的,公平的。也许我只是返回功能代码本身并将其存储在变量中然后运行它。但它也不起作用。

Meteor.methods({

    consoleLogOnClient: function(text){
        var log = function(){ 
            console.log(text);
        };
        return log;
    }

});

var myFunction = Meteor.call('consoleLogOnClient', 'THIS MESSAGE SHOULD APPEAR ON THE CLIENT CONSOLE');

myFunction();

2 个答案:

答案 0 :(得分:2)

http://docs.meteor.com/#meteor_methods

  

他们应该返回一个EJSON-able值或抛出异常。

EJSON:http://docs.meteor.com/#ejson

因此,答案是您无法从服务器向客户端发送函数,因为函数不是EJSON值。但你真正的问题可能是你要发送一个功能;我无法想象你为什么要那样做。改为发送数据。

答案 1 :(得分:1)

您可以使用anticoders:client-call包获得所需的结果。它允许您定义您能够从服务器端运行的客户端方法。

例如,如果您定义:

Meteor.ClientCall.methods({
  'consoleLog': function(message) {
    console.log(message);
  },
});

为方法设置userIdclientId

Deps.autorun(function() {
  Meteor.ClientCall.setClientId(Meteor.userId());
});

然后在服务器端,您只需致电:

Meteor.ClientCall.apply(userId, 'consoleLog', ['THIS MESSAGE SHOULD APPEAR IN THE CLIENT CONSOLE']);