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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:21:12