自定义错误处理程序无法在Express中工作

时间:2020-09-15 14:52:06

标签: node.js typescript express

我正在尝试对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>
&nbsp; &nbsp;at E:\Programming\leslie\server\build\app.js:12:19<br>
&nbsp; &nbsp;at Layer.handle [as handle_request] (E:\Programming\leslie\server\node_modules\express\lib\router\layer.js:95:5)<br>
&nbsp; &nbsp;at next (E:\Programming\leslie\server\node_modules\express\lib\router\route.js:137:13)<br>
&nbsp; &nbsp;at Route.dispatch (E:\Programming\leslie\server\node_modules\express\lib\router\route.js:112:3)<br>
&nbsp; &nbsp;at Layer.handle [as handle_request] (E:\Programming\leslie\server\node_modules\express\lib\router\layer.js:95:5)<br>
&nbsp; &nbsp;at E:\Programming\leslie\server\node_modules\express\lib\router\index.js:281:22<br>
&nbsp; &nbsp;at Function.process_params (E:\Programming\leslie\server\node_modules\express\lib\router\index.js:335:12)<br>
&nbsp; &nbsp;at next (E:\Programming\leslie\server\node_modules\express\lib\router\index.js:275:10)<br>
&nbsp; &nbsp;at E:\Programming\leslie\server\node_modules\body-parser\lib\read.js:130:5<br>
&nbsp; &nbsp;at invokeCallback (E:\Programming\leslie\server\node_modules\raw-body\index.js:224:16)</pre>
</body>

</html>

1 个答案:

答案 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" });
});
相关问题