Javascript 调试程序在Meteor.call客户端/服务器调试后停止

Javascript 调试程序在Meteor.call客户端/服务器调试后停止,javascript,meteor,Javascript,Meteor,我一直在尝试在服务器端调试Meteor方法。在客户端(Chrome)中进行调试时,调试器将一直执行到下面代码的第4行(“Meteor.call”),并立即返回到第2行(“convlist:function()”),避免执行第2条调试器指令。客户端/服务器控制台中没有错误。我也有服务器端调试器,但运行的进程从未跳转到它(中的服务器调试)。如有任何建议,将不胜感激 客户端: Template.conversationList.helpers({ convlist: function(){

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

客户端:

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;
    }
  });
} 
  • 为什么服务器端的方法返回一个值,但在客户端显示为未定义?原因:在客户端调试模式下,返回的值似乎未定义,但稍后会从服务器得到答案。尝试使用Session.set变量捕获返回值,并在服务器应答时获取动态更新

  • 为什么客户端调试器在第四行停止
  • 在客户端,方法调用被执行,并且只传递稍后要执行的回调-它不会在调用方法的同时运行。而且,由于命令调试器只是断点的快捷方式,因此实际上不会执行它。因此,客户端只运行第4行,然后完成convlist函数是正确的

  • 代码从不跳转到服务器端调试器:
  • 一旦启动“meteor debug”,服务器将在默认情况下暂停运行。必须打开节点检查器()才能取消暂停并启动应用程序。请注意,Firefox无法很好地加载节点检查器,并且可能无法解除服务器的暂停,在这种情况下,您将永远不会在服务器端看到换行符

  • 为什么服务器端的方法返回一个值,但在客户端显示为未定义
  • 方法调用是异步的。因此,当您在客户端调用它时,它会立即返回undefined,然后开始在服务器上执行。完成后,将调用回调函数,您可以访问结果值。您可以将回调中的结果存储在会话变量中,并在从服务器方法调用返回结果后将其显示在模板中

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

    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行),立即返回,您是对的,我在方法调用之外插入了第三个调试器,现在调试器正在停止,谢谢。还切换到safari进行服务器调试。出现的问题是,我在服务器端(var newConv)得到一个结果值,但在客户端(var result)这个结果是“未定义的”。有什么想法吗?编辑了答案,其中提到了为什么结果是未定义的。最后我在客户端找到了为什么方法在调试模式下返回未定义的。由于客户端和服务器异步运行,返回值会在稍后出现,因此我必须使用Session.set变量在返回值出现时呈现它。现在正在工作。谢谢