Recentemente em um projeto, precisei chamar via ajax uma aplicação que foi construída usando Node sem nenhuma biblioteca, e tive a barreira do CORS.
Um breve disclaimer:
O CORS é o browser que obriga ter essa configuração, por isso que a requisição retorna resultado no postman e outros clientes rest. Já no borwser não é retornado http status 200.
Segundo site de developers da Mozilla, uma visão geral de CORS é:
O padrão de Compartilhamento de Recursos entre Origens (CORS) trabalha adicionando novos cabeçalhos HTTP que permitem que o servidor descreva o conjunto de origens que são permitidas a ler essa informação usando um navegador web. Além disso, para métodos de requisição HTTP que podem causar efeitos colaterais nos dados do servidor (em particular, para métodos HTTP que não sejam GET, ou para utilização de GET com certos MIME types), a especificação delega que navegadores “pré-enviem” a requisição, solicitando os métodos suportados pelo servidor com um método de requisição HTTP OPTIONS, e depois, após “aprovação” do servidor, envie a requisição verdadeira com o método de requisição HTTP efetivo. Servidores também podem notificar clientes se “credenciais” (incluindo Cookies e informações de HTTP Authentication) devem ser enviadas com as requisições.Seções subsequentes discutem cenários, assim como provêem a decomposição dos cabeçalhos HTTP utilizados.
Segue o link.
O texto acima significa que, nosso backend precisa definir quem vai ter acesso a tais métodos.
Existem muitas informações na internet para a configuração de CORS usando a biblioteca express, eu precisei criar um serviço em node como falei anteriormente sem biblioteca e tive que configurar o CORS.
Devido a pouca informação para configurar com node puro, resolvi criar o post.
Vamos a alguns esclarecimentos, a aplicação está em node puro porque ela faz algo muito simples e que precisa ser de rápido processamento, logo optamos a usar sem nenhuma biblioteca.
Essa aplicação funciona como um Middleware. Levando e filtrando informação de um lado para o outro.
Então vamos ao código:
O nosso cors precisa ser definido no response. Precisaremos incluir as linhas:
res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Request-Method', '*'); res.setHeader('Access-Control-Allow-Methods', 'OPTIONS, GET'); res.setHeader('Access-Control-Allow-Headers', '*');
E pronto, agora nossa aplicação node já está pronta para receber requisições de outra origem.
Como o código vai ficar no final:
Arquivo http.service.js
module.exports = { createServer: (callback, options) => { return require('http').createServer(callback); } }
Arquivo index.js
const HttpService = require('./service/http.service'); let server; let port = 8180; const serverCallback = (req, res) => { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Request-Method', '*'); res.setHeader('Access-Control-Allow-Methods', 'OPTIONS, GET'); res.setHeader('Access-Control-Allow-Headers', '*'); require('./helper-request').parseJsonBody(req, res).then(data => { console.log(JSON.stringify(data)); }); switch (req.method) { case 'GET': // some code here break; case 'POST': // some code here break; default: // some code here } }; server = HttpService.createServer(serverCallback, false); server.listen(port, () => { console.log('Executando servidor na porta ' + port + '!'); });