Como definir o cabeçalho de resposta nos recursos do express.js

164

Preciso definir o CORS para ser ativado nos scripts servidos pelo express. Como posso definir os cabeçalhos nessas respostas retornadas para público / ativos?

Dr.Knowitall
fonte

Respostas:

358

Há pelo menos um middleware no npm para manipular o CORS no Express: cors . [veja @mscdex answer]

Isto é como definir cabeçalhos de resposta personalizados, no ExpressJS DOC

res.set(field, [value])

Defina o campo do cabeçalho como valor

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

ou passe um objeto para definir vários campos ao mesmo tempo.

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

Aliasado como

res.header(field, [value])
klode
fonte
Como posso obter esses valores? Porque eu defino esses valores em resobjeto. Quando tento ver esse conteúdo, fico indefinido usando res.headers;
Bruno Casali 5/05
Então eu uso res.write('content')?
George
1
Esta linha deve ser usada antes de escrever a cabeça.
Virendra Singh Rathore
Por alguma razão res.set, não funcionou para mim, mas o corsmiddleware fez o truque da maneira certa.
Cezar D.
Os cabeçalhos extras do @BrunoCasali são bloqueados pelo navegador por padrão, consulte stackoverflow.com/a/37931084/1507207
sbk201 14/01
48

Isso é tão chato.

Tudo bem se alguém ainda está tendo problemas ou simplesmente não deseja adicionar outra biblioteca. Tudo o que você precisa fazer é colocar essa linha de código de mercadorias intermediárias antes de suas rotas.

Exemplo 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)=> {...});
Proximo
fonte
1
Importante este ponto em relação ao pedido. Fiquei me perguntando se realmente era importante, pois vi comportamentos diferentes ao alterá-lo. Agradável. Obrigado
Alejandro Teixeira Muñoz
1
Nice: resolveu o problema perfeitamente. Adicionar uma dependência inteira para executar essas 6 linhas de código não é um caminho que eu recomendaria a ninguém ...
Alex Clark
11

Você pode fazer isso usando cors. cors irá lidar com sua resposta CORS

var cors = require('cors')

app.use(cors());
Rahul Solanki
fonte
10

Resposta curta:

  • res.setHeaders - chama o método Node.js nativo

  • res.set - define cabeçalhos

  • res.headers - um alias para res.set

Charlie
fonte
9

Há pelo menos um middleware no npm para manipular o CORS no Express: cors .

mscdex
fonte
7

Você também pode adicionar um middleware para adicionar cabeçalhos CORS, algo como isso funcionaria:

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

A resposta do @ klode está certa.

No entanto, você deve definir outro cabeçalho de resposta para torná-lo acessível a outras pessoas.


Exemplo:

Primeiro, você adiciona 'tamanho da página' no cabeçalho da resposta

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

Então, tudo que você precisa fazer é expor seu cabeçalho

response.set('Access-Control-Expose-Headers', 'page-size')
kpanodrean
fonte
Fiquei preso por mais de uma hora tentando descobrir por que nenhum dos meus cabeçalhos personalizados estava chegando ao outro lado. Expor eles foi a resposta. Muito obrigado! Por que esse cabeçalho tem zero menção nos documentos do Express (ou em qualquer artigo que eu tenha lido até agora sobre cabeçalhos personalizados) é muito intrigante.
Devin Spikowski
E se você tivesse 2 cabeçalhos? Assim: javascript res.set("...","..."); res.set("...","...."); Agora, como você expõe esses 2 cabeçalhos?
Cursor
Eu descobri como ler os documentos:javascript Access-Control-Expose-Headers: * // or Access-Control-Expose-Headers: <header-name>, <header-name>, ...
Cursor