未设置 Node.js 响应标头

Posted

技术标签:

【中文标题】未设置 Node.js 响应标头【英文标题】:Node.js response headers are not set 【发布时间】:2018-06-24 00:29:45 【问题描述】:

我正在尝试将 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  … 

【问题讨论】:

【参考方案1】:

res.setHeader()res.writeHead()是Node.js的原生方法,res.set()是Express框架的方法。

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

这三个方法做的事情完全一样,就是设置 HTTP 响应的 headers。唯一的区别是res.setHeader()res.writeHead() 只允许您设置单个标题,而res.set() 将允许您设置多个标题。因此,请使用适合您需求的那一款。

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

【讨论】:

感谢您的提示。我尝试使用 res.setHeader 并在服务器端记录 res -object。它确实在服务器端显示了 from -header,但是在客户端执行 console.log(response.headers) 时,它只显示一个名为“function wd/ @nyoatype 随时!【参考方案2】:

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

【讨论】:

【参考方案3】:

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

我正在使用 NodeJS/express 中间件来托管一种安全形式的 json-server,并且我试图将 headers 集合的内容转储到控制台以查看它们是否都正确显示。这就是我出错的地方,原因如下:

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

现在,如果您不需要查看完整的集合,请随时致电您需要的特定值,例如rsp.headers.get("_returnCode")。当您进行此类调用时,会在尝试返回第一个值之前为您调用 init() 方法,并且一切正常。

希望这会有所帮助!

【讨论】:

以上是关于未设置 Node.js 响应标头的主要内容,如果未能解决你的问题,请参考以下文章

Node.js:新创建的标头(res.header)未出现在 Chrome 中

从 ExtJS 向 node.js 请求时出现 CORS 问题。请求或响应标头不正确?

在 Node.js/Express 中,如何自动将此标头添加到每个“渲染”响应中?

如何使用 express 在用户浏览器的响应标头 cookie 中查找 JSON Web 令牌 (JWT) 来制作 node.js?

Node.js + Socket.io |在服务器上设置自定义标头

Node.js 发送到客户端后无法设置标头