抛出到客户端时Meteor.Error是否会发生变化?

时间:2017-07-10 10:44:03

标签: javascript node.js meteor callback

我有这个:

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与服务器上的不同(似乎它已被更改为内部服务器错误)。为什么是这样?更重要的是,我如何才能获得原始(在这种情况下是超时)错误?

1 个答案:

答案 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。