未设置Node.js响应标头

时间:2018-01-15 11:19:02

标签: angularjs node.js http express header

我尝试将Nodejs标头设置为返回的数据包,但在记录响应时,它始终为空。

这是我在node.js服务器中的中间件。它应该添加" From"标题为响应,但它不会出现在记录响应的客户端中。

编辑:

除了将res.set()更改为res.setHeaders()之外,我还必须使用response.headers()而不是response.headers

在客户端访问它们。
app.use(function(reg, res, next){
        var checkAdmin = false;
        var bearerToken;
        var bearerHeader = reg.headers.authorization;
        if(admin.indexOf(reg.url) > -1){
                console.log("varmistetaan onko admin");
                checkAdmin = true;
                checkYourPrivilege(checkAdmin, bearerHeader, res, reg, next);
        } else if(public.indexOf(reg.url) < 0){
                console.log("varmistetaan onko suojattu");
                checkYourPrivilege(checkAdmin, bearerHeader, res, reg, 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.set('From','test@test.com');
                                        next();
                                }
                        }else{
                                res.set('From','test@test.com');
                                next();
                        }
                }else{
                        res.set('From','test@test.com');
                        next();
                }
        }
});

这是我的angularjs拦截器,它正在记录响应:

.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){
                        console.log(response);
                        return response
                },
                'responseError': function(responseError){
                        responseError = JSON.parse(responseError.data);
                        if(responseError.tokenstatus === "expired"){
                                delete $localStorage.accessToken
                                window.location = "/";
                        }
                        if(response.status === 401 || response.status === 403) {
                                window.location = "/";
                        }
                        window.location = "/";
                        return $q.reject(response);
                }
        };
}])

这就是响应的样子:

{…}
config: {…}
cache: Object { put: put(), get: get(), remove: remove(), … }
headers: Object { Accept: "application/json, text/plain, */*", Authorization: "bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwcml2aWxlZ2VzIjp7ImFkbWluIjp0cnVlLCJhc3Vubm90IjpmYWxzZSwib3Bpbm5vdCI6ZmFsc2V9LCJvcHRpZXRvbWVtYmVyIjpmYWxzZSwiYXN1bm5vdG1lbWJlciI6ZmFsc2UsImV4cGlyZXMiOjE1MTYwNDA3MjksImlhdCI6MTUxNjAwNDcyOX0.hU8yT3G58ZtkJbBo-SUwLmcSMSX_8cHYxnX0GdmfJVM" }
jsonpCallbackParam: "callback"
method: "GET"
paramSerializer: function Ef/this.$get/<()
transformRequest: Array [ Df/this.defaults.transformRequest<() ]
transformResponse: Array []
url: "koti.html"
__proto__: Object { … }
data: "<h1>Tähän tulee kotisivun sisältö</h1>\n"
headers: wd/<() #Response headers should be here?
length: 1
name: ""
__proto__: function ()
status: 200
statusText: "OK"
__proto__: Object { … }

3 个答案:

答案 0 :(得分:2)

res.setHeader()res.writeHead()是Node.js的本机方法,res.set()是Express框架中的方法。

文档:res.setHeader()res.set() res.writeHead

这三种方法完全相同,设置标头HTTP响应。唯一的区别是res.setHeader()res.writeHead()只允许您设置单个标头,res.set()将允许您设置多个标头。所以请使用符合您需求的那个。

您可以尝试以下任何一项: res.setHeader('From','test@test.com')res.writeHead(200,{'Form':'test@test.com'})

答案 1 :(得分:0)

在所有地方尝试使用res.setHeader(不是res.set)

答案 2 :(得分:0)

我意识到最初的问题表明了AngularJS的使用,尽管对此的回答可能有所帮助,但它们似乎不适用于Angular的更高版本(即2+版本)。

我正在使用NodeJS / express中间件来托管安全形式的json服务器,并且试图将headers集合的内容转储到控制台以查看它们是否都正确无误。这是我出问题的地方,这就是原因:

响应对象的headers属性不是方法,而是对象,并且标头以延迟加载的方式处理。这意味着将内容转储到控制台会产生一个完全空的集合,这使我相信自己有一个错误。为了访问完整的收藏集,您首先需要致电rsp.headers.init()

现在,如果您不需要查看完整的集合,请随时通过rsp.headers.get("_returnCode")之类的调用来调用所需的特定值。进行此类调用时,将在尝试返回第一个值之前为您调用init()方法,并且所有方法都应正常工作。

希望这会有所帮助!