我在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”时代码中断了:
“未定义不是函数”
答案 0 :(得分:5)
您不能将函数作为参数传递给Meteor方法。
为什么会这样?
从安全问题来看,您是否意识到基本上您正试图让客户端在服务器端上下文中执行任何代码?你不能相信客户,有人可以使用Meteor.call(“logUser”,function(){破坏你的服务器的恶意代码});在浏览器控制台中,用一行代码终止你的服务器!
我猜Meteor.call的参数是使用JSON格式序列化的,它不允许使用函数,所以这在技术上是不可能的。您可以将该函数作为字符串传递并在服务器上进行评估,但这将是一个可怕的错误!
这里发生的事情是,在服务器上执行了方法的异步执行之后,传递给Meteor.call的函数确实被视为在客户端上执行的回调,这就是为什么你被欺骗的想法该方法很好地触发了,但显然并非如此。
所以meteor方法根本没有传递任何参数,这就是为什么“callback”在其代码中未定义的原因。
引用Meteor文档:(http://docs.meteor.com/#meteor_call)
“如果你包含一个回调函数作为最后一个参数(它不能作为方法的参数,因为函数不可序列化),该方法将异步运行。”
所以你在这里做错了(无论如何都没有在服务器上提供会话),我认为你应该重新考虑你想要达到的目标。
答案 1 :(得分:5)
解决方案:
客户方:
Meteor.call("logUser", function(error , result){
if(error)
console.log(error.reason);
else
console.log(result);
});
服务器端:
Meteor.methods({
logUser : function(){
return "myString";
}
});