如何在express.js资产上设置响应标头


Answers:


358

npm上至少有一个中间件用于处理Express中的CORS:cors。[请参阅@mscdex答案]

这是从ExpressJS DOC设置自定义响应头的方法

res.set(field, [value])

将标题字段设置为值

res.set('Content-Type', 'text/plain');

或传递一个对象以一次设置多个字段。

res.set({
  'Content-Type': 'text/plain',
  'Content-Length': '123',
  'ETag': '12345'
})

别名为

res.header(field, [value])

如何获得这些值?因为我在res对象中设置了这些值。当我尝试查看此内容时,我会使用res.headers
布鲁诺·卡萨利

那我用res.write('content')
乔治

1
写入磁头之前,应使用此行。
维伦德拉·辛格·拉索

出于某种原因res.set,这对我不起作用,但是cors中间件恰好可以解决问题。
Cezar D.

默认情况下,@ BrunoCasali多余的标头会被浏览器阻止,请参阅stackoverflow.com/a/37931084/1507207
sbk201

48

真烦人

好的,如果有人仍然有问题或者只是不想添加另一个库。您所要做的就是在路由之前放置此中间件代码行。

Cors示例

app.use((req, res, next) => {
    res.append('Access-Control-Allow-Origin', ['*']);
    res.append('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.append('Access-Control-Allow-Headers', 'Content-Type');
    next();
});

// Express routes
app.get('/api/examples', (req, res)=> {...});

1
这一点相对于顺序很重要。我想知道它是否真的很重要,因为在更改它时我看到了不同的行为。真好 谢谢
Alejandro TeixeiraMuñoz

1
尼斯:完美解决了问题。添加完整的依赖关系来执行这6行代码不是我向任何人推荐的路...
Alex Clark


10

简短答案:

  • res.setHeaders -调用原生Node.js方法

  • res.set -设置标题

  • res.headers -res.set的别名


9

npm上至少有一个中间件用于处理Express中的CORS:cors


7

您还可以添加中间件来添加CORS标头,如下所示即可:

/**
 * Adds CORS headers to the response
 *
 * {@link https://en.wikipedia.org/wiki/Cross-origin_resource_sharing}
 * {@link http://expressjs.com/en/4x/api.html#res.set}
 * @param {object} request the Request object
 * @param {object} response the Response object
 * @param {function} next function to continue execution
 * @returns {void}
 * @example
 * <code>
 * const express = require('express');
 * const corsHeaders = require('./middleware/cors-headers');
 *
 * const app = express();
 * app.use(corsHeaders);
 * </code>
 */
module.exports = (request, response, next) => {
    // http://expressjs.com/en/4x/api.html#res.set
    response.set({
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Methods': 'DELETE,GET,PATCH,POST,PUT',
        'Access-Control-Allow-Headers': 'Content-Type,Authorization'
    });

    // intercept OPTIONS method
    if(request.method === 'OPTIONS') {
        response.send(200);
    } else {
        next();
    }
};

4

service.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
    next();
  });


3

@klode的答案是正确的。

但是,您应该设置另一个响应头,以使其他人可以访问您的头。


例:

首先,您在响应标题中添加“ page-size”

response.set('page-size', 20);

然后,您需要做的就是公开标题

response.set('Access-Control-Expose-Headers', 'page-size')

我被困了一个多小时,试图弄清楚为什么我的自定义标头都没有使它到达另一端。揭露它们是答案。非常感谢!为什么在Express文档(或到目前为止我读过的有关自定义标头的任何文章)中零标头的原因非常令人困惑。
Devin Spikowski

如果您有2个标题,该怎么办?像这样:javascript res.set("...","..."); res.set("...","...."); 现在,如何显示这两个标头?
游标

我发现如何阅读文档:javascript Access-Control-Expose-Headers: * // or Access-Control-Expose-Headers: <header-name>, <header-name>, ...
光标
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.