Javascript 为什么console.log()在Meteor方法内部时不能在客户端工作?
我想为客户机和服务器定义相同的方法,因此在Javascript 为什么console.log()在Meteor方法内部时不能在客户端工作?,javascript,methods,meteor,client,console.log,Javascript,Methods,Meteor,Client,Console.log,我想为客户机和服务器定义相同的方法,因此在common/methods.js中有以下代码 Meteor.methods({ doSomething: function (obj) { if(this.isSimulation) { console.log('client'); } if(!this.isSimulation) { console.log('server'); }
common/methods.js
中有以下代码
Meteor.methods({
doSomething: function (obj) {
if(this.isSimulation) {
console.log('client');
}
if(!this.isSimulation) {
console.log('server');
}
console.log('both');
return "some string";
}
});
Meteor.call('doSomething', someObj, function (e, data) {
console.log(e);
console.log(data);
});
然后我在client/dev.js
中调用了这个方法
Meteor.methods({
doSomething: function (obj) {
if(this.isSimulation) {
console.log('client');
}
if(!this.isSimulation) {
console.log('server');
}
console.log('both');
return "some string";
}
});
Meteor.call('doSomething', someObj, function (e, data) {
console.log(e);
console.log(data);
});
在服务器控制台上,我可以阅读:
I20150622-21:56:40.460(8)? server
I20150622-21:56:40.461(8)? both
在客户端(Chrome for UbuntuV43.0.2357.125(64位))控制台上,会打印e
和data
参数,但Meteor方法中的console.log()
不是我期望它输出字符串的位置
client
both
为什么console.log()
不能在Meteor方法内部的客户端上工作?
为了调试,我将Meteor.methods分解为单独的客户机和服务器代码。然后引入一个大循环,这样服务器端的操作需要很长时间才能完成,而客户端则非常快 服务器
doSomething: function (obj) {
var x = 0;
for(var i = 0; i< 9999999; i++) {
x++;
}
console.log(x);
return "some string";
}
但是,客户端上不会打印任何消息。方法仅在服务器上执行,它们是执行远程调用的同步方式 方法 方法是可以从客户端调用的服务器函数。他们 在您想做更多事情的情况下非常有用 比插入、更新或删除数据更复杂,或者在需要执行数据操作时更复杂 仅允许和拒绝很难实现的验证
感谢@kainlite帮助我一起调试。原来问题很简单 我在
common/methods.js
中定义了我的方法,而我的客户端调用是在client/dev.js
中进行的,它首先被加载
因此,当调用时,该方法没有定义,因此它不会运行。将
methods.js
文件移动到/lib
目录中,解决了这个问题。console.log(this.isSimulation)给了您什么?@Robin它在服务器上给了我false
,在客户端上什么都没有。谢谢您的回答,但我想是在客户端和服务器都可以访问的地方定义它(在common/methods.js
中),那么Meteor方法将作为存根在客户端上运行。请更正我的理解。文档中所述的方法仅在服务器上运行,如果您希望代码同时在服务器或客户端上运行,则必须将其放置在名为lib或common的文件夹下,但不在客户端、服务器或方法上……如果它打算在客户端和服务器上运行…我可以建议您阅读这本电子书:让您开始,这样您就可以了解一切是如何配合的…感谢您的帮助kalnlite,我已经阅读了Discovery Meteor的相关部分。请看一下[此答案[()使用Meteor.methods在客户端上定义存根。我明白你的意思,这是延迟补偿的一部分,因此你的更改将立即在客户端上进行,但只有在服务器从方法调用返回时才是最终的或有效的,清楚吗?