从服务器方法中抛出 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 会导致脚本退出的主要内容,如果未能解决你的问题,请参考以下文章