我正在为带有express和TypeScript项目的node.js构建错误处理中间件。在其中,我有一个AppError
扩展的类Error
。看起来像这样:
class AppError extends Error {
public readonly internalCode: number | undefined;
public readonly httpCode: number;
public readonly message: string;
constructor(httpCode: number, message: string, internalCode?: number) {
super();
this.internalCode = internalCode;
this.message = message;
this.httpCode = httpCode;
}
public generateReport(): GenericReport {
return {
code: this.internalCode,
message: this.message,
};
}
}
我目前正在使用以下中间件new AppError()
在一条/error
路由中进行捕获errorHandler
:
function errorHandler(err: Error, request: Request, response: Response, next: NextFunction,): Response {
if (err instanceof AppError) {
const report = err.generateReport();
return response.status(err.httpCode).json(report);
}
return response.status(500).json(err);
}
我试图AppError
在err
[[Prototype]]链上找到中间件,但是在TypeScript代码中验证总是失败。但是,在使用Babel对其进行编译并使用来运行JS版本后node
,err instanceof AppError
解析为true
。为什么在TS代码中没有显示?
在以上示例中,Object.getPrototypeOf(err)
返回me Error {}
,并将err
类型更改为AppError
或any
不影响结果。
据我了解,应该将新构造的对象(new AppError()
运行后)链接到[[Prototype]] AppError
。并curl http://localhost:3333/error
在TS服务器上运行{ "internalCode": 1, "message": "This is an error", "httpCode": 500 }
,这意味着它err
确实是由创建的AppError()
。
该GitHub存储库中有一个解决此问题的有效示例。对此主题的任何澄清将不胜感激。
我看了看你的代码。一些评论:
instanceof
用于尝试做的事情。我认为出于您的错误中间件的目的,instanceof更具意义。如果您有兴趣,我还编写了一个错误处理中间件,该中间件做了类似的事情:
https://github.com/curveball/problem/blob/master/src/index.ts
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句