【问题标题】:debugger stop after Meteor.call perhaps client/server debugging调试器在 Meteor.call 之后停止,可能是客户端/服务器调试
【发布时间】:2016-04-11 04:54:50
【问题描述】:

我一直在尝试在服务器端调试 Meteor 方法。在客户端(在 Chrome 中)中调试时,调试器一直执行到下面代码的第 4 行(“Meteor.call”),并立即返回到第 2 行(“convlist:function()”),避免第二条调试器指令。客户端/服务器控制台中没有错误。我也有服务器端调试器,但运行进程从不跳转到它(http://localhost:8080/debug?port=5858 中的服务器调试)。任何建议将不胜感激。

客户端:

Template.conversationList.helpers({
  convlist: function(){
    debugger;
    Meteor.call('getConvList', function(error, result){
    if(error){
      alert('Error');
    } else {
      debugger; // just to evaluate the result var
      return result;
    }
  });
  //edited 3rd debugger; 
  debugger;
}}); 

服务器端:

if (Meteor.isServer) {
  Meteor.methods({
    getConvList: function(){
      debugger;
      let myUser = new Array();
      myUser.push(Meteor.user()._id);
      var newConv = Conversations.aggregate([{ "$match" : { "users": {"$in":                         [Meteor.user()._id]}}}, { "$project": { lstmsg:1, "conversator": {"$setDifference": ["$users", myUser] }}}]);
      return newConv;
    }
  });
} 

【问题讨论】:

    标签: javascript meteor


    【解决方案1】:
    1. 为什么服务器端的方法返回一个值,但在客户端却显示为未定义?原因:在客户端调试模式下返回的值似乎是未定义的,但答案稍后来自服务器。尝试使用 Session.set 变量来捕获返回的值,并在服务器应答到来时获取动态更新。

    1. 为什么客户端调试器在第 4 行停止?

    在客户端,方法调用被执行,并且只传递回调以稍后执行 - 它不会在调用方法的同时运行。并且因为命令调试器只是一个断点的快捷方式,它并没有真正执行。所以客户端只运行第4行,然后完成convlist函数是正确的。

    1. 代码永远不会跳转到服务器端调试器:

    一旦你启动“meteor debug”,服务器就会默认暂停。您必须打开节点检查器 (http://localhost:8080/debug?port=5858) 才能取消暂停并启动您的应用程序。请注意,Firefox 无法很好地加载节点检查器,并且可能无法取消暂停服务器,在这种情况下,您将永远不会在服务器端看到换行符。

    1. 为什么服务器端的方法返回一个值,但在客户端却显示为未定义?

    方法调用是异步的。因此,当您在客户端调用它时,它会立即返回 undefined,然后开始在服务器上执行。完成后,将调用回调函数,并且您可以访问结果值。您可以将结果存储在 Session 变量中的回调中,并使用它在您的模板中显示 - 一旦它从服务器方法调用返回。

    此外,请确保调试器指令位于您传递给方法调用的回调函数中。请记住,正确的方法调用是 Method.call('methodName', inputParameter, callbackFunction); 尝试传递一个空输入参数,并检查回调执行的结果——这对我来说是不同的。如果我没有传递任何 inputParameter,当回调运行时,错误和结果都是未定义的,但是如果我传递任何 inputParam,那么该函数具有正确的参数。客户端前:

    Template.conversationList.helpers({
      convlist: function(){
        debugger;
        Meteor.call('getConvList', null, function(error, result){
        if(error){
          alert('Error');
        } else {
          debugger; // just to evaluate the result var
          return result;
        }
      });
      //edited 3rd debugger; 
      debugger;
    }}); 
    

    【讨论】:

    • 实际上客户端的调试控制台正在运行,这就是为什么我知道它执行每个步骤,直到第4行代码,然后停止。我还在端口 5858 上运行服务器调试。问题是为什么调试器停止在提到的行中而不跳转到服务器端,也没有返回客户端中的第二个调试器指令。
    • 在客户端,它跳过了第二个调试器,因为方法调用是异步的,所以它会触发方法调用(第 4 行),立即返回,并完成 convlist 函数的执行。
    • 你说得对,我在方法调用之外插入了第三个调试器,现在调试器正在停止,谢谢。还切换到 safari 进行服务器调试。出现的问题是我在服务器端(var newConv)得到一个结果值,但这个结果在客户端(var result)中显示为“未定义”。有什么想法吗?
    • 编辑了答案,包括提及为什么结果未定义。
    • 我终于找到了为什么在客户端该方法在调试模式下返回未定义。由于客户端和服务器异步运行,返回值稍后出现,因此我必须使用 Session.set 变量在返回值出现时呈现返回值。现在正在工作。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多