如何实现返回状态与JSON的结构化响应接口?能否扩展Express?
扩展Express响应以统一返回指定结构
完全可以通过扩展Express的Response对象来实现这个需求,以下是具体实现步骤:
1. 扩展Express的类型定义(TypeScript)
创建类型声明文件(比如types/express/index.d.ts),让TypeScript识别我们的自定义响应方法:
import { ObjectResponseInterface } from '../path/to/your/interface'; declare global { namespace Express { interface Response { sendCustomResponse: (objRes: ObjectResponseInterface) => void; } } }
2. 实现自定义响应中间件
编写中间件,给Express的Response对象添加自定义方法:
import { Request, Response, NextFunction } from 'express'; import { ObjectResponseInterface } from '../path/to/your/interface'; export const customResponseMiddleware = (req: Request, res: Response, next: NextFunction) => { res.sendCustomResponse = (objRes: ObjectResponseInterface) => { res.status(objRes.status).json(objRes); }; next(); };
3. 注册中间件并使用
在Express应用中注册中间件,之后所有路由都可以直接调用自定义方法返回统一结构:
import express from 'express'; import { customResponseMiddleware } from './middlewares/customResponse'; import { ObjectResponseInterface } from './path/to/your/interface'; const app = express(); // 全局注册中间件(需在路由之前) app.use(customResponseMiddleware); // 示例路由 app.get('/api/data', (req, res) => { const response: ObjectResponseInterface = { status: 200, error: false, response: { list: ['item1', 'item2'] } }; // 直接调用自定义方法 res.sendCustomResponse(response); }); app.listen(3000, () => console.log('Server running on port 3000'));
补充说明
- 自定义方法
sendCustomResponse会自动帮你完成res.status(objRes.status).json(objRes)的操作,避免重复代码 - 类型扩展保证了TypeScript的类型检查和代码提示,不会出现类型报错
- 中间件是全局生效的,所有路由都能直接使用这个方法
内容的提问来源于stack exchange,提问作者AlJw
相关产品推荐
相关产品推荐

