在express中处理javascript错误

在express中处理javascript错误,javascript,node.js,express,error-handling,Javascript,Node.js,Express,Error Handling,假设我有以下异步函数 export async function someAsyncFunction() { const result = await fetchData(); return result[0].id; } 在我的路线上 router.post( '/some-path', handleErrorAsync(async (req: Request, resp: Response, _err: Errback) => { const data = a

假设我有以下异步函数

export async function someAsyncFunction() {
  const result = await fetchData();
  return result[0].id;
}
在我的路线上

router.post(
  '/some-path',
  handleErrorAsync(async (req: Request, resp: Response, _err: Errback) => {
    const data = await someAsyncFunction();
    resp.json(data)
  })
);
我有错误处理功能,可以

interface ResponseError extends Error {
  statusCode: number;
}

// Middleware to respond with an error when error caught
export function handleError(
  err: ResponseError,
  _req: Request,
  resp: Response,
  _next: NextFunction
) {
  if (err) {
    resp.status(err.statusCode || 500).json(err);
  }
}

export const handleErrorAsync = (func: Function) => (
  req: Request,
  res: Response,
  next: NextFunction
) => {
  func(req, res, next).catch((error: Error) => {
    next(error);
  });
};
因此,如果例如
fetchData
有一个错误响应对象,那么这可以很好地工作,但是当错误是一个常规javascript错误时,它无法打印错误对象,而只是打印带有500个错误的
{}

例如,此行
返回结果[0].id
如果结果为空(
[]
),则会抛出
TypeError
,这将被
handleError
中间件捕获,但是
.json(err)
部分将只显示
{}

是否有一种方法可以使用同一中间件获取服务器错误(正常工作)和内部服务器错误?

res.json do json.parse,它返回一个空对象{}。 我可以建议对err主体进行分解

resp.status(err.statusCode | | 500).json({message:err.message,err:err});
这将为每个返回空对象{}的本机错误

res.json do json.parse提供一条消息。 我可以建议对err主体进行分解

resp.status(err.statusCode | | 500).json({message:err.message,err:err});

这将为每个本机错误提供一条消息

您可以扩展
到json
错误方法

let a=新错误(“hi”)
log(JSON.stringify(a))
Error.prototype.toJSON=函数(){
常量alt={};
//取得全部财产
Object.getOwnPropertyNames(this.forEach)((键)=>{
alt[键]=此[键];
});
//仅获取消息属性
//alt[“message”]=此[“message”]
返回alt;
}

console.log(JSON.stringify(a))
您可以扩展
到JSON
错误方法

let a=新错误(“hi”)
log(JSON.stringify(a))
Error.prototype.toJSON=函数(){
常量alt={};
//取得全部财产
Object.getOwnPropertyNames(this.forEach)((键)=>{
alt[键]=此[键];
});
//仅获取消息属性
//alt[“message”]=此[“message”]
返回alt;
}

log(JSON.stringify(a))
我建议在错误处理程序中使用res.send()

return res.status(500).send(err.message);


我建议在错误处理程序中使用res.send()

return res.status(500).send(err.message);

我使用

我使用


谢谢你的回答,谢谢你的链接,它引导我使用它,并解决了这个问题!谢谢你的回答,谢谢你的链接,它引导我使用它,并解决了这个问题!谢谢这有帮助!另一个解决方案是使用谢谢!这有帮助!另一个解决办法是使用