【问题标题】:Why is console.log() not working client-side when inside Meteor methods?为什么在 Meteor 方法中时 console.log() 不能在客户端工作?
【发布时间】:2015-06-22 14:03:24
【问题描述】:

我想为客户端和服务器定义相同的方法,所以我在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";
    }
});

然后我在client/dev.js里面调用了这个方法。

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 Ubuntu v43.0.2357.125 (64-bit)) 控制台上,打印了 edata 参数,但来自 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";
}

客户

doSomething: function (obj) {
    console.log('client');
}

仍然没有在客户端上打印任何消息。

【问题讨论】:

  • console.log(this.isSimulation) 给你什么?
  • @Robin 它在服务器上给了我false,而在客户端上什么也没有。

标签: javascript methods meteor client console.log


【解决方案1】:

感谢@kainlite 帮助我一起调试。原来问题是file load order 的一个简单问题。

我在common/methods.js 中定义了我的方法,而我的客户端调用是在client/dev.js 中进行的,它首先被加载。

所以当调用时方法没有定义,因此它不会运行。将methods.js 文件移动到/lib 目录中解决了这个问题。

【讨论】:

    【解决方案2】:

    方法只在服务器上执行,它们是进行远程调用的同步方式。

    方法

    方法是可以从客户端调用的服务器函数。他们 在您想做更多事情的情况下很有用 比插入、更新或删除复杂,或者当你需要做数据时 仅通过允许和拒绝很难实现的验证。

    http://docs.meteor.com/#/basic/Meteor-users

    【讨论】:

    • 谢谢你的回答,但我想通过在客户端和服务器都可以访问的地方定义它(它在common/methods.js),然后Meteor方法将作为存根在客户端运行.请纠正我的理解。
    • 文档中所述的方法仅在服务器中运行,如果您希望代码在服务器或客户端上运行,则必须将其放在名为 lib 或 common 的文件夹下,但不是在客户端、服务器或方法上...如果它打算在客户端和服务器上运行,您也不需要将其定义为方法...
    • 我可以推荐您阅读这本电子书:Discover Meteor 以帮助您入门,这样您就可以了解所有内容如何组合在一起...
    • 感谢kalnlite的帮助,我已经阅读了Discover Meteor的相关部分。请通过查看 [this answer[(stackoverflow.com/a/13145432/2317532) 帮助我,其中使用 Meteor.methods 在客户端上定义了存根。
    • 我明白你的意思,这是延迟补偿的一部分,所以你的更改将立即在客户端上进行,但只有当服务器从方法调用返回时它才会是最终的或有效的,是不是很清楚?
    猜你喜欢
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多