Node.js中如何配置axios请求携带Cookie转发至本地服务
问题根因
withCredentials配置仅对浏览器环境的XHR/ Fetch请求生效:Node.js服务端运行的axios不存在浏览器的Cookie沙箱环境,和浏览器发往3000端口的请求上下文完全隔离,开启该参数不会自动读取、透传当前Express接口收到的Cookie内容。Node环境下该参数仅用于控制axios自身维护的CookieJar是否自动携带对应域名的Cookie,和当前请求上下文无关。- 2999端口的Express服务未引入
cookie-parser中间件:即使请求携带了Cookie头,也无法自动解析到req.cookies字段,直接打印该字段会一直返回空对象。 - 服务端间的请求不会触发浏览器CORS校验,你当前配置的CORS规则对本次axios转发场景不生效。
修复方案
按以下步骤调整代码即可:
- 两个Express服务都安装并启用
cookie-parser中间件
先安装依赖:
在两个服务的路由注册前,添加中间件引用:npm i cookie-parserconst cookieParser = require('cookie-parser') // 注意要在所有路由注册前调用 app.use(cookieParser()) - 3000端口服务的
/request接口中,手动透传收到的Cookie头到axios请求中,删除无效的withCredentials配置:app.get('/request', async (req: Request, res: Response) => { console.log(req.cookies) console.log(req.headers.cookie) let url = 'http://localhost:2999' try { const result = await axios.get(url, { headers: { // 手动透传上游请求的Cookie头 Cookie: req.headers.cookie } }) console.log(result.headers) } catch (error) { console.log(error) } res.send(true) }) - (可选)如果后续有浏览器直接请求2999端口服务的需求,修正CORS配置的origin值为实际来源地址(带端口):
app.use(cors({ credentials: true, origin: "http://localhost:3000", // 补全端口号,匹配实际前端/3000服务的访问地址 allowedHeaders: [ 'Content-Type', 'Authorization', ], }));
验证流程
修改完成后重启两个服务:
- 先访问
http://localhost:3000/setcookie完成Cookie写入 - 再访问
http://localhost:3000/request触发转发逻辑 - 查看2999端口服务的控制台输出,即可看到正常打印的Cookie请求头和解析后的
req.cookies字段内容
内容的提问来源于stack exchange,提问作者user2625247
相关产品推荐
相关产品推荐

