4

我在 Meteor.js 上的那段代码出错:

客户端 :

      Meteor.call("logUser", function(myvar){
        console.log("le chat client : "+myvar) ;
        Session.set("chatId", myvar);
     });  

服务器端 :

  Meteor.methods({
      logUser : function(mycallback){
        mycallback("myString");
      }
  });

我真的不明白为什么它不起作用,该方法被很好地触发但是当调用“mycallback”时代码会中断:

“未定义不是函数”

4

2 回答 2

5

解决方案 :

客户端 :

    Meteor.call("logUser", function(error , result){
      if(error)
          console.log(error.reason);
      else
          console.log(result);

    });

服务器端 :

 Meteor.methods({
      logUser : function(){
        return "myString";
      }
  });
于 2013-11-03T17:51:26.203 回答
5

您不能将函数作为参数传递给 Meteor 方法。

为什么呢 ?

  • 出于安全考虑,您是否知道基本上您是在尝试让客户端在服务器端上下文中执行任何代码?您不能信任客户端,有人可以使用 Meteor.call("logUser",function(){破坏您服务器的恶意代码}); 在浏览器控制台中并在一行代码中杀死您的服务器!

  • 我猜 Meteor.call 的参数是使用 JSON 格式序列化的,它不允许函数,所以这在技术上是不可能的。您可以将函数作为字符串传递并在服务器上对其进行评估,但这将是一个可怕的错误!

这里发生的是,您传递给 Meteor.call 的函数确实被视为在服务器上执行该方法的异步执行之后在客户端执行的回调,所以这就是为什么您被欺骗认为该方法是触发良好,而显然并非如此。

因此,meteor 方法根本没有传递任何参数,这就是为什么在其代码中未定义“回调”的原因。

引用 Meteor 文档:(http://docs.meteor.com/#meteor_call

“如果您将回调函数作为最后一个参数(它不能作为方法的参数,因为函数不可序列化),则该方法将异步运行。”

所以你在这里做错了(无论如何服务器上都没有会话),我认为你应该重新考虑你想要实现的任何方法。

于 2013-11-03T17:39:39.817 回答