从服务器方法中抛出 Meteor.Error 会导致脚本退出

Posted

技术标签:

【中文标题】从服务器方法中抛出 Meteor.Error 会导致脚本退出【英文标题】:Throwing a Meteor.Error from a server method causes script to exit 【发布时间】: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 发出错误信号的正确方法是什么?

【问题讨论】:

【参考方案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 运行良好。我希望它在文档中,但只是含糊其辞。谢谢! 不确定是否相关,但零秒超时可能会导致问题。 ***.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);
     
  
)

【讨论】:

以上是关于从服务器方法中抛出 Meteor.Error 会导致脚本退出的主要内容,如果未能解决你的问题,请参考以下文章

如何从 java servlet 中抛出 404 错误?

使用 Mockito 从模拟中抛出已检查的异常

从变量中抛出异常

如何捕获ctypes中抛出的异常?

调用可以抛出,但错误不能从全局变量初始化器中抛出

从匿名内部类的构造函数中抛出异常