是否可以从 NodeJs 的 Promise 中的 catch 块中抛出错误?

Is it possible to throw an error from a catch block in a Promise in NodeJs?

关于上下文,我正在使用 NextJs。

基本上来自我的 api 页面之一 /api/sendData.ts,我正在执行一个方法调用 process() ,它属于一个单独的 class platform.ts.

API 代码的结构(在 sendData.ts 中):

try {
  platform.process(someParam);
} catch (err) {
  console.log('caught error');
  // do further handling here
}

platform.ts 中 process() 的实现:

SomeLibrary.request( {content} )
.then( (response) => console.log(response) )
.catch( (err) => { console.log('throwing'); throw err; } );

目前,这不会返回错误(或者至少我无法从调用者那里捕获),而是打印出“throwing”,然后是“UnhandledPromiseRejectionWarning: StatusCodeError: 401 .... ”。我也试过这个:

.catch( function(err) { throw err; } );

根据我的阅读,似乎在 catch 块中抛出错误实际上是“返回另一个承诺”,因此承诺链并未真正解决(?)或完成。

如何在 catch 块中抛出错误,以便将此错误传播回 sendData.ts 进行处理?是否有可能将错误备份起来,以便我可以从我的服务器端处理错误(nextjs 中的./api)

P.S。此线程强调了我面临的完全相同的错误,none 的回复能够解决我的问题:

要么删除 try catch 块,要么在 catch 块中抛出错误。 可能缺少等待流程功能的承诺

try {
  await platform.process(someParam);
} catch (err) {
  console.log('caught error');
  // throw error regardless
  throw err;
}

你的问题是你没有从 platform.process() 返回承诺,也没有等待那个异步函数的响应。因此你的 catch 块代码永远不会 运行 因为从 platform.process() 抛出的代码是异步的。

我会这样处理:

try {
  await platform.process(someParam);
} catch (err) {
  console.log('caught error');
  // do further handling here
}

platform.process(下面是一个示例,因为我们看不到 platform.process 的编码方式):

function process(someParam) {
  return SomeLibrary.request( {content} )
  .then( (response) => console.log(response) )
  .catch( (err) => { 
    console.log('throwing'); 
    return Promise.reject(err);
  } );
}

或(另一种写法platform.process):

async function process(someParam) {
  try{
    const response = await SomeLibrary.request( {content} );
    console.log(response);
  catch(err) {
    console.log(err);
    return Promise.reject(err);
  }
}