You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 上即可,性能更高也不会产生多余的响应头:

  1. 调整中间件代码:
export const isAuthenticated = async (req, res, next) => {
    req.isAuth = true;
    next();
}
  1. 控制器读取:
export const controller: RequestHandler = async (req, res) => {
    const isAuth = req.isAuth;
    console.log('isAuth: ', isAuth)
};

TypeScript 项目如果出现类型报错,扩展 Request 接口的类型声明即可。

内容的提问来源于stack exchange,提问作者NN_05

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 04:36:05