¿Cómo puedo configurar el encabezado de respuesta en los activos express.js


164

Necesito configurar CORS para que esté habilitado en los scripts servidos por express. ¿Cómo puedo configurar los encabezados en estas respuestas devueltas para public / assets?

Respuestas:


358

Hay al menos un middleware en npm para manejar CORS en Express: cors . [ver respuesta @mscdex]

Así es como establecer encabezados de respuesta personalizados, desde el ExpressJS DOC

res.set(field, [value])

Establecer campo de encabezado en valor

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

o pasar un objeto para establecer múltiples campos a la vez.

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

Alias ​​como

res.header(field, [value])

¿Cómo puedo obtener estos valores? Porque establezco estos valores en resobjeto. Cuando trato de ver este contenido, uso indefinido res.headers;
Bruno Casali

Entonces uso res.write('content')?
George

1
Esta línea debe usarse antes de escribir el encabezado.
Virendra Singh Rathore

Por alguna razón res.setno funcionó para mí, pero el corsmiddleware funcionó perfectamente.
Cezar D.

Los encabezados adicionales de @BrunoCasali están bloqueados por el navegador de forma predeterminada, consulte stackoverflow.com/a/37931084/1507207
sbk201 el

48

Esto es muy molesto.

De acuerdo, si alguien todavía tiene problemas o simplemente no quiere agregar otra biblioteca. Todo lo que tiene que hacer es colocar esta línea de código de middleware antes de sus rutas.

Ejemplo de 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
Importante este punto relativo al orden. Me preguntaba si realmente era importante ya que vi diferentes comportamientos al cambiarlo. Agradable. Gracias
Alejandro Teixeira Muñoz

1
Agradable: resolvió el problema perfectamente. Agregar una dependencia completa para realizar estas 6 líneas de código no es un camino que recomendaría a cualquiera ...
Alex Clark

11

Puedes hacer esto usando cors. cors manejará su respuesta CORS

var cors = require('cors')

app.use(cors());

10

Respuesta corta:

  • res.setHeaders - llama al método Node.js nativo

  • res.set - establece encabezados

  • res.headers - un alias para res.set


9

Hay al menos un middleware en npm para manejar CORS en Express: cors .


7

También puede agregar un middleware para agregar encabezados CORS, algo así funcionaría:

/**
 * 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

La respuesta de @klode es correcta.

Sin embargo, se supone que debe configurar otro encabezado de respuesta para que otros puedan acceder a su encabezado.


Ejemplo:

Primero, agrega 'tamaño de página' en el encabezado de respuesta

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

Entonces, todo lo que necesita hacer es exponer su encabezado

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

Estuve atrapado durante más de una hora tratando de averiguar por qué ninguno de mis encabezados personalizados llegaba al otro lado. Exponerlos fue la respuesta. Muchas gracias! Por qué este encabezado tiene cero mención en los documentos Express (o en cualquier artículo que haya leído hasta ahora sobre los encabezados personalizados) es muy desconcertante.
Devin Spikowski el

¿Qué pasa si tienes 2 encabezados? De esta manera: javascript res.set("...","..."); res.set("...","...."); Ahora, ¿cómo expones esos 2 encabezados?
Cursor el

Descubrí cómo leer los documentos:javascript Access-Control-Expose-Headers: * // or Access-Control-Expose-Headers: <header-name>, <header-name>, ...
Cursor
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.