Express 和 Typescript - Error.stack 和 Error.status 属性不存在

编程代码typescript

1个回答

写回答

Heayoung

2025-06-19 16:15

+ 关注

typescript
typescript

使用 Express 和 typescript 构建 web 应用程序时,我们经常需要处理错误。在处理错误时,常常需要打印错误堆栈信息和设置错误的状态码。然而,在某些情况下,我们可能会发现 Express 的 Error 对象上并没有我们期望的 stackstatus 属性。那么我们应该如何解决这个问题呢?

在 Express 中,当出现错误时,它会创建一个 Error 对象,并将其传递给错误处理中间件。我们可以通过自定义错误处理中间件来对错误进行处理。但是在处理错误之前,我们需要确保 Error 对象上有 stackstatus 属性,以便于调试和正确地响应错误。

为了解决这个问题,我们可以使用 typescript 的类型声明来扩展 Express 的默认错误对象。通过这种方式,我们可以为 Error 对象添加我们需要的属性,从而使其具有更多的功能。

在下面的代码示例中,我们将展示如何通过 typescript 扩展 Express 的默认错误对象,以添加 stackstatus 属性。

首先,我们需要创建一个新的 .d.ts 类型声明文件,用于扩展 Express 的默认错误对象。我们可以将文件命名为 express.d.ts

typescript

// express.d.ts

declare global {

namespace Express {

interface Error {

stack?: string;

status?: number;

}

}

}

在上述代码中,我们在全局命名空间下扩展了 Express 的 Error 接口。我们添加了可选的 stackstatus 属性。通过这样做,我们可以确保在使用 Express 的错误处理中间件时,错误对象上将始终存在这两个属性。

然后,我们需要在主要的 typescript 文件中引入这个类型声明文件。

typescript

// app.ts

import express, { Request, Response, NextFunction } from 'express';

import './express'; // 引入类型声明文件

const app = express();

// 错误处理中间件

app.use((err: Error, req: Request, res: Response, next: NextFunction) => {

console.error(err.stack); // 打印错误堆栈信息

res.status(err.status || 500).JSon({ error: err.message }); // 设置错误状态码并响应错误信息

});

// 示例路由

app.get('/', (req: Request, res: Response) => {

throw new Error('Something went wrong'); // 抛出一个错误

});

app.listen(3000, () => {

console.log('Server is running on port 3000');

});

在上述代码中,我们首先引入了 Express、Request、Response、NextFunction 类型。然后,我们通过 import './express' 来引入我们之前创建的类型声明文件。

接下来,我们定义了一个错误处理中间件,它接收四个参数:errreqresnext。在错误处理中间件中,我们可以访问到错误对象,并通过 err.stack 打印错误堆栈信息,通过 err.status 获取错误状态码。

最后,我们定义了一个示例路由,当访问根路径时,我们手动抛出一个错误。这样我们就能够在错误处理中间件中捕获到这个错误,并进行相应的处理。

通过上述的代码示例,我们成功地扩展了 Express 的默认错误对象,使其具有了 stackstatus 属性。这将大大提高我们在开发过程中调试错误和正确响应错误的能力。

在 Express 和 typescript 应用程序中,我们经常需要处理错误。然而,有时候我们会发现 Express 的 Error 对象上并没有我们期望的 stackstatus 属性。为了解决这个问题,我们可以使用 typescript 的类型声明来扩展 Express 的默认错误对象,并为其添加我们需要的属性。通过这种方式,我们可以在错误处理中间件中更好地调试和响应错误。

希望这篇文章对你理解如何扩展 Express 的错误对象有所帮助!

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号