Node.js响应头设置后客户端无法读取问题求助
解决Node.js响应头在AngularJS客户端无法读取的问题
看起来你遇到的问题是两个细节错误导致的——服务器端的拼写笔误,加上客户端读取响应头的方式不对。我帮你一步步梳理解决方案:
1. 服务器端代码修正
首先,你的代码里有个明显的笔误:把请求对象req写成了reg,这会导致你无法正确获取请求头,后续逻辑也会受影响。另外,建议统一用res.setHeader()来设置响应头(和res.set()功能类似,但写法更统一)。
修正后的Node.js中间件代码:
app.use(function(req, res, next){ var checkAdmin = false; var bearerToken; var bearerHeader = req.headers.authorization; // 修正reg为req if(admin.indexOf(req.url) > -1){ console.log("varmistetaan onko admin"); checkAdmin = true; checkYourPrivilege(checkAdmin, bearerHeader, res, req, next); } else if(public.indexOf(req.url) < 0){ console.log("varmistetaan onko suojattu"); checkYourPrivilege(checkAdmin, bearerHeader, res, req, next); } else { bearerToken = decodeToken(bearerHeader); if(bearerToken !== false){ decoded = verifyToken(bearerToken); if(decoded !== false){ if (checkIfExpired(decoded.expires)){ res.setHeader('From','test@test.com'); next(); }else{ res.setHeader('From','test@test.com'); next(); } }else{ res.setHeader('From','test@test.com'); next(); } }else{ res.setHeader('From','test@test.com'); next(); } } });
2. 客户端AngularJS拦截器修正
你当前的代码里直接打印response,但AngularJS的response对象中,响应头是通过**headers()方法**来获取的,而不是直接访问headers属性(控制台里显示的wd/<()就是方法本身,不是结果)。另外,浏览器会自动把HTTP头名称转为小写,读取时要注意大小写。
修正后的拦截器代码:
.factory('authInterceptorService', ['$q', '$window', '$localStorage', function($q, $window, $localStorage){ return { 'request': function (config){ config.headers = config.headers || {}; if ($localStorage.accessToken) { config.headers.Authorization = 'bearer ' + $localStorage.accessToken; } return config; }, 'response' : function(response){ // 调用headers()方法获取响应头对象 const responseHeaders = response.headers(); console.log('完整响应头:', responseHeaders); console.log('From头的值:', responseHeaders['from']); // 注意用小写的from return response; }, 'responseError': function(responseError){ // 避免重复解析JSON导致报错 try { responseError = JSON.parse(responseError.data); } catch(e) {} if(responseError?.tokenstatus === "expired"){ delete $localStorage.accessToken; window.location = "/"; } if(responseError?.status === 401 || responseError?.status === 403) { window.location = "/"; } return $q.reject(responseError); } }; }])
3. 跨域场景额外配置(如果需要)
如果你的前端和后端是跨域部署的(比如域名、端口不同),浏览器会默认隐藏自定义响应头,这时候需要在服务器端添加Access-Control-Expose-Headers头,把From头暴露给客户端:
// 在设置From头的同时添加这行 res.setHeader('Access-Control-Expose-Headers', 'From');
做完这些修改后,你就能在客户端的控制台里看到From响应头的内容了。
内容的提问来源于stack exchange,提问作者nyoatype
相关产品推荐
相关产品推荐

