Javascript TryCatch装饰程序未捕获错误

Javascript TryCatch装饰程序未捕获错误,javascript,jquery,node.js,Javascript,Jquery,Node.js,以下tryCatch装饰程序无法捕获错误 const TryCatchWrapper = (target, key, descriptor) => { const fn = descriptor.value; descriptor.value = (...args) => { try { fn.apply(this, args); } catch (error) { console.log('Entered Catch----->

以下tryCatch装饰程序无法捕获错误

const TryCatchWrapper = (target, key, descriptor) => {
  const fn = descriptor.value;
  descriptor.value = (...args) => {
    try {
      fn.apply(this, args);
    } catch (error) {
      console.log('Entered Catch----->');
      const [,, next] = args;
      next(error);
    }
  };
};
正在尝试在下面的类中使用-

class CustomerDetails {

  @TryCatchWrapper
  async getCustomerSummary(req, res, next) {
      throw new Error('Whoops!!!');
  }
}
问题:-
“Entered Catch------>”永远不会被打印出来。

这是因为
getCustomerSummary
是一个
async
函数。
async
函数从不抛出;相反,它返回一个被拒绝的承诺。(在
async
函数中,当您在
wait
周围使用
try
/
catch
时,这会变成承诺拒绝处理。但在调用
async
函数的非
async
函数中,不会使用糖。)


您需要修改decorator以查看函数的返回值,如果它是承诺,则处理承诺拒绝。

实际上,您的方法没有问题。您只是忘记了等待
fn的结果。应用
并将
描述符.value
设置为
async
函数。 请参见此处的示例


非常感谢。至少它给了我一个方向。你有没有这样做过?只是好奇,你为什么在
fn.apply
中使用
this
?如果我没记错的话,“this”实际上是CustomerDetails实例范围。这样,“this”内部实例方法就绑定到实际的customerDetails实例
const TryCatchWrapper = (target, key, descriptor) => {
  const fn = descriptor.value;
  descriptor.value = async (...args) => {
    try {
      await fn.apply(this, args);
    } catch (error) {
      console.log('Entered Catch----->');
      const [,, next] = args;
      next(error);
    }
  };
};