¿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?

Dr.Knowitall
fuente

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])
klode
fuente
¿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)=> {...});
Del mes próximo
fuente
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());
Rahul Solanki
fuente
10

Respuesta corta:

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

  • res.set - establece encabezados

  • res.headers - un alias para res.set

Charlie
fuente
9

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

mscdex
fuente
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();
    }
};
magikMaker
fuente
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();
  });

Thitikan Choeibamrung
fuente
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')
kpanodrean
fuente
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