【问题标题】:Throwing a Meteor.Error from a server method causes script to exit从服务器方法中抛出 Meteor.Error 会导致脚本退出
【发布时间】:2014-04-12 12:38:25
【问题描述】:

我从服务器端方法抛出 Meteor.Error 异常。

throw new Meteor.Error( 500, 'There was an error processing your request' );

我的目标是让客户端 Meteor.call 接收此错误,确实如此,但抛出也会导致节点进程退出。

错误:永远检测到脚本退出,代码:8

在不终止脚本的情况下,从 Meteor.methods() 向 Meteor.call 发出错误信号的正确方法是什么?

【问题讨论】:

    标签: meteor


    【解决方案1】:

    如果您以某种方式从方法的光纤之外抛出方法,就会发生这种情况。例如

    Meteor.methods({
        test: function() {
            setTimeout(function() {
                throw new Meteor.Error( 500, 'There was an error processing your request' );
            }, 0);
        }
    });
    

    如果您使用的东西可以逃脱该方法正在其中运行的光纤,则可能会导致 Meteor 退出。

    您只需要确保在光纤内部抛出错误。 (例如在上面的例子中你可以使用Meteor.setTimeout而不是setTimeout

    如果您使用 npm 模块,则应使用 Meteor.bindEnvironment 进行回调。或 Meteor.wrapAsync 以确保回调在同一纤程中运行。

    一旦你这样做了,你的应用就不会崩溃,也不会导致它永远重启。

    【讨论】:

    • Meteor.bindEnvironment 运行良好。我希望它在文档中,但只是含糊其辞。谢谢!
    • 不确定是否相关,但零秒超时可能会导致问题。 stackoverflow.com/questions/9647215/…
    【解决方案2】:

    第一个参数应该是字符串而不是流星 1.2.1 中的整数

    http://docs.meteor.com/#/full/meteor_error

    【讨论】:

    • 不是节点进程退出的原因
    【解决方案3】:

    试试这个:

    Meteor.methods({
      "foo":function(){
        try{
          var id = Clients.insert(client);
          if(id){
            return id;
          }
        }catch(e){
          throw new Meteor.Error(400,e.message);
        } 
      }
    })
    

    【讨论】:

      猜你喜欢
      • 2012-04-11
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 2021-05-13
      • 2022-01-20
      相关资源
      最近更新 更多