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在客户端上定义存根。我明白你的意思,这是延迟补偿的一部分,因此你的更改将立即在客户端上进行,但只有在服务器从方法调用返回时才是最终的或有效的,清楚吗?