我正在尝试对Express路由使用自定义错误处理程序,但无法使其正常工作。我遵循了documentation,他们说您必须在use
链的末尾放置处理程序,但看起来仍然像默认错误处理程序一样被调用。
我已经将我的项目简化为最基本的内容,这就是我所拥有的。我只是在start
实例上调用App
方法,以使服务器开始监听。
import * as express from "express";
import { Express, Request, Response } from "express";
import * as bodyParser from "body-parser";
export class App {
private static readonly port: number = 8080;
private app: Express;
public constructor() {
this.app = express();
this.app
.use(bodyParser.json())
.get("/", (): void => {
throw new Error("Error from UserRoute class");
})
.use((_: Request, res: Response): void => {
console.log("Requested route not found");
res.status(404)
.send({ error: "Not found" });
})
.use((err: any, _: Request, res: Response): void => {
console.error("Unexpected error: ", err.stack);
res.status(500)
.send({ error: "An unexpected error occured" });
});
}
public start(): void {
this.app.listen(App.port, (): void => {
console.log("Server started!");
});
}
}
404可以工作,但是当我在http:// localhost:8080 /上使用邮递员发出请求时,得到以下内容作为响应正文:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Error: Error from UserRoute class<br>
at E:\Programming\leslie\server\build\app.js:12:19<br>
at Layer.handle [as handle_request] (E:\Programming\leslie\server\node_modules\express\lib\router\layer.js:95:5)<br>
at next (E:\Programming\leslie\server\node_modules\express\lib\router\route.js:137:13)<br>
at Route.dispatch (E:\Programming\leslie\server\node_modules\express\lib\router\route.js:112:3)<br>
at Layer.handle [as handle_request] (E:\Programming\leslie\server\node_modules\express\lib\router\layer.js:95:5)<br>
at E:\Programming\leslie\server\node_modules\express\lib\router\index.js:281:22<br>
at Function.process_params (E:\Programming\leslie\server\node_modules\express\lib\router\index.js:335:12)<br>
at next (E:\Programming\leslie\server\node_modules\express\lib\router\index.js:275:10)<br>
at E:\Programming\leslie\server\node_modules\body-parser\lib\read.js:130:5<br>
at invokeCallback (E:\Programming\leslie\server\node_modules\raw-body\index.js:224:16)</pre>
</body>
</html>
答案 0 :(得分:2)
问题是您的错误处理中间件没有定义为实际的错误处理程序,因为缺少next
参数。将其更改为以下应该可以解决该问题:
.use((err: any, _: Request, res: Response, next: Function): void => {
console.error("Unexpected error: ", err.stack);
res.status(500).send({ error: "An unexpected error occured" });
});