2013-11-03 46 views
4

我收到提示与Meteor.js这段代码:Meteor.methods()回调错误

客户端:

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

服务器端:

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

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

“未定义不是函数”

回答

5

解决方案:

客户端:

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

    }); 

服务器端:

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

});

5

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

这是为什么?

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

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

这里会发生什么事是你传递给Meteor.call功能确实视为方法的异步执行后,客户端上执行的回调已经在服务器上执行的,所以这就是为什么你欺骗性地认为该方法被很好地触发,而显然不是这种情况。

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

引述流星文档:(http://docs.meteor.com/#meteor_call

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

所以你在这里做错了什么(服务器上无法提供Session),我认为你应该重新考虑这个方法。

+0

几分钟前我找到了解决方案,感谢您的帮助! – Lombric