Meteor.methods()回调错误

Lom*_*ric 4 methods callback meteor

我在Meteor.js上遇到这段代码的错误:

客户端 :

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

服务器端 :

  Meteor.methods({
      logUser : function(mycallback){
        mycallback("myString");
      }
  });
Run Code Online (Sandbox Code Playgroud)

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

"未定义不是一个功能"

sai*_*unt 5

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

为什么会这样 ?

  • 从安全问题来看,您是否意识到基本上您正试图让客户端在服务器端上下文中执行任何代码?你不能相信客户,有人可以使用Meteor.call("logUser",function(){破坏你的服务器的恶意代码}); 在浏览器控制台中,用一行代码终止服务器!

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

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

所以meteor方法根本没有传递任何参数,这就是为什么"callback"在其代码中未定义的原因.

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

"如果你包含一个回调函数作为最后一个参数(它不能作为方法的参数,因为函数不可序列化),该方法将异步运行."

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


Lom*_*ric 5

方案:

客户端 :

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

    });
Run Code Online (Sandbox Code Playgroud)

服务器端 :

 Meteor.methods({
      logUser : function(){
        return "myString";
      }
  });
Run Code Online (Sandbox Code Playgroud)