如何在Node.js Express中间件中设置响应头并在控制器正常读取
问题解决说明
根因
你使用了错误的方法读取响应头:Express 中 res.header() 是 res.set() 的别名,仅用于设置响应头,不支持读取操作。当你只传入一个键名参数时,方法会直接返回 res 对象本身,这就是你拿到完整 ServerResponse 对象的原因。
解决方案
方案1:正确读取响应头
如果确实需要从响应头中读取已设置的值,使用 res.get() 或者 Node.js 原生的 res.getHeader() 方法:
import httpStatus from 'http-status'; import { RequestHandler } from 'express'; export const controller: RequestHandler = async (req: Request<ParamsDictionary, any, any, QueryString.ParsedQs>, res: Response<any>) => { const isAuth = res.get('isAuth'); // 或 const isAuth = res.getHeader('isAuth'); console.log('isAuth: ', isAuth) };
注意响应头的值会被自动转为字符串,若需要布尔类型可自行转换:const isAuth = res.get('isAuth') === 'true'。
补充:如果该自定义头需要返回给客户端,建议遵循HTTP命名规范,加上
X-前缀改为X-IsAuth,避免和标准响应头冲突。
方案2:更推荐的服务端内部传值方案
如果你只是需要在中间件和控制器之间传递标识,不需要将该值返回给客户端,直接将标识挂载到请求对象 req 上即可,性能更高也不会产生多余的响应头:
- 调整中间件代码:
export const isAuthenticated = async (req, res, next) => { req.isAuth = true; next(); }
- 控制器读取:
export const controller: RequestHandler = async (req, res) => { const isAuth = req.isAuth; console.log('isAuth: ', isAuth) };
TypeScript 项目如果出现类型报错,扩展 Request 接口的类型声明即可。
内容的提问来源于stack exchange,提问作者NN_05
相关产品推荐
相关产品推荐

