我有这个:
Meteor.methods({
'foo'() {
try{
...//some http.get
} catch (e) {
console.log(e); //-> { [Error: ETIMEDOUT] code: 'ETIMEDOUT', connect: true }
if(e.code === 'ETIMEDOUT') { throw e; }
}
}
});
所以现在我在客户端:
Meteor.call('foo', function(error, result) {
if(error){
if(error.code === 'ETIMEDOUT') {
//this block is never reached.. why?
}
}
}
但似乎error.code与服务器上的不同(似乎它已被更改为内部服务器错误)。为什么是这样?更重要的是,我如何才能获得原始(在这种情况下是超时)错误?
答案 0 :(得分:2)
来自manual:
如果您有一个不需要向客户报告的错误, 但它是服务器的内部,抛出一个常规的JavaScript错误 宾语。这将作为完全不透明的方式报告给客户 内部服务器错误,没有详细信息。
这就是你所看到的。代替:
当服务器无法完成用户所需的操作时 因为一个已知的条件,你应该抛出一个描述性的 Meteor.Error对象到客户端。 Meteor.Error有三个参数:错误,原因和细节。
所以你可能会这样做:
if (e.code === 'ETIMEDOUT') {
let userMessage = 'The remote call timed out.';
let detail = `${userMessage}: ${JSON.stringify(e)}`;
console.error(detail);
throw new Meteor.Error('remote-call-timed-out', userMessage, detail);
}
第一个参数,"错误" (我称之为"代码"),您可以在客户端上编程以采取特定操作或国际化用户消息。这就是我们在系统中所做的事情。 (如果找不到代码,我们会显示userMessage)。详细信息将写入服务器日志并放入浏览器console.log。