CORS está bien en el servidor y funciona según lo previsto. Intenté enviar solicitudes a la API REST de mi servidor con HTTPClient angular y recibo un error de CORS. ¿Por qué es esto un error si CORS está habilitado en el servidor? ¿No debería estar bien para el cliente?
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:3000/api/blah/blah (Reason: CORS header 'Access-Control-Allow-Origin' missing).
Para referencia futura, fue la respuesta de "Davids" la que me ayudó, el cors no se agregó antes de todo el enrutamiento.
"..... Es decir, antes de que se defina la ruta". así que justo después de... var app = express();
Solo uso... app.use(cors());
El uso compartido de recursos de origen cruzado, también conocido como CORS , es un mecanismo que utiliza encabezados HTTP adicionales para indicar a los navegadores que le den a una aplicación web que se ejecuta en un origen (p. ej., http://localhost:3000
), acceso a recursos seleccionados desde un origen diferente (p. ej., http://localhost:8080
). En otras palabras, una aplicación web ejecuta una solicitud HTTP de origen cruzado cuando solicita un recurso que tiene un origen diferente (dominio, protocolo o puerto) del suyo. Por razones de seguridad, los navegadores restringen las solicitudes HTTP de origen cruzado iniciadas desde scripts.
El encabezado Access-Control-Allow-Origin
determina qué orígenes pueden acceder a los recursos del servidor a través de CORS.
¿Cómo solucionar problemas de CORS?
Puede hacerlo usted mismo creando un middleware Express
. Aquí está el fragmento de código apropiado:
// Enable CORS for specific origins: app.use((req, res, next) => { // Allow multiple predefined origins const allowedOrigins = ["https://deployed-app.com", "http://localhost:3000"]; const origin = req.headers.origin; // extract the origin from the header if (allowedOrigins.indexOf(origin) > -1) { // if the origin is present in our array res.setHeader("Access-Control-Allow-Origin", origin); // set the CORS header on the response } res.header( "Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept" ); next(); // move on to the next middleware });
Alternativamente, puede aceptar todas las solicitudes, pero esta opción solo es apropiada si está en desarrollo o si su API es pública :)
app.use((req, res, next) => { res.header("Access-Control-Allow-Origin", "*"); next(); });
Además, hay un middleware Express
CORS y así es como lo usaría:
npm install cors --save
Habilitar todas las solicitudes de CORS:
const express = require('express'); const cors = require('cors'); const app = express(); app.use(cors()); app.get('/products/:id', function (req, res, next) { res.json({msg: 'This is CORS-enabled for all origins!'}) }); const port = process.env.PORT || 8080; app.listen(port, () => { console.log(`CORS-enabled server is up on ${port}`); });
Habilitar CORS para una sola ruta
const express = require('express'); const cors = require('cors'); const app = express(); app.get('/products/:id', cors(), (req, res, next) => { res.json({msg: 'This is CORS-enabled for a Single Route'}) }); const port = process.env.PORT || 8080; app.listen(port, () => { console.log(`CORS-enabled server is up on ${port}`); });
Problema importante: cuando se trata de middleware Express, el orden es muy importante. Así que asegúrese de que CORS esté habilitado antes que cualquier otro controlador/ruta/middleware que pueda depender de él.
No necesita habilitar cors en angular, este es un problema del lado del servidor. Ver: