调试器在Meteor.call(可能是客户端/服务器调试)之后停止

debugger stop after Meteor.call perhaps client/server debugging

本文关键字:调试 服务器 之后 客户端 Meteor call 调试器      更新时间:2024-05-06

我在服务器端调试Meteor方法时遇到了问题。在客户端(在Chrome中)调试时,调试器会执行到下面代码的第4行("Meteor.call"),并立即返回到第2行("convlist:function()"),避免执行第2条调试器指令。客户端/服务器控制台中没有错误。我也有服务器端调试器,但运行的进程从未跳转到它(中的服务器调试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;
    }
  });
} 
  1. 为什么服务器端的方法返回一个值,但在客户端却显示为未定义?原因:在客户端调试模式下,返回的值似乎未定义,但稍后服务器会给出答案。尝试使用Session.set变量来捕获返回的值,并在服务器答案到来时获得动态更新

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

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

  1. 代码从不跳转到服务器端调试器:

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

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

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

此外,请确保调试器指令位于要传递给方法调用的回调函数内。请记住,正确的方法调用是Method.call('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;
}});