Estoy tratando de admitir CORS en mi aplicación Node.js que usa el marco web Express.js. Leí una discusión grupal de Google sobre cómo manejar esto, y leí algunos artículos sobre cómo funciona CORS. Primero, hice esto (el código está escrito en sintaxis CoffeeScript):
app.options "*", (req, res) ->
res.header 'Access-Control-Allow-Origin', '*'
res.header 'Access-Control-Allow-Credentials', true
# try: 'POST, GET, PUT, DELETE, OPTIONS'
res.header 'Access-Control-Allow-Methods', 'GET, OPTIONS'
# try: 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'
res.header 'Access-Control-Allow-Headers', 'Content-Type'
# ...
No parece funcionar. Parece que mi navegador (Chrome) no está enviando la solicitud de OPCIONES inicial. Cuando acabo de actualizar el bloque para el recurso, necesito enviar una solicitud GET de origen cruzado a:
app.get "/somethingelse", (req, res) ->
# ...
res.header 'Access-Control-Allow-Origin', '*'
res.header 'Access-Control-Allow-Credentials', true
res.header 'Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS'
res.header 'Access-Control-Allow-Headers', 'Content-Type'
# ...
Funciona (en Chrome). Esto también funciona en Safari.
He leído que ...
En un navegador que implementa CORS, cada solicitud GET o POST de origen cruzado está precedida por una solicitud OPTIONS que verifica si GET o POST está OK.
Entonces mi pregunta principal es, ¿cómo es que esto no parece suceder en mi caso? ¿Por qué no se llama a mi bloque app.options? ¿Por qué necesito configurar los encabezados en mi bloque app.get principal?
fuente
Respuestas:
Para responder a su pregunta principal, la especificación CORS solo requiere que la llamada OPTIONS preceda a POST o GET si POST o GET tiene contenido o encabezados no simples.
Los tipos de contenido que requieren una solicitud previa al vuelo de CORS (la llamada OPTIONS) son cualquier tipo de contenido, excepto los siguientes :
application/x-www-form-urlencoded
multipart/form-data
text/plain
Cualquier otro tipo de contenido aparte de los enumerados anteriormente activará una solicitud previa al vuelo.
En cuanto a los encabezados, cualquier encabezado de solicitud que no sea el siguiente activará una solicitud previa al vuelo:
Accept
Accept-Language
Content-Language
Content-Type
DPR
Save-Data
Viewport-Width
Width
Cualquier otro encabezado de solicitud activará la solicitud previa al vuelo.
Por lo tanto, puede agregar un encabezado personalizado como:,
x-Trigger: CORS
y eso debería activar la solicitud previa al vuelo y presionar el bloque OPTIONS.Consulte la referencia de la API web de MDN: solicitudes con verificación previa de CORS
fuente
OPTIONS
bloques no se envían. Sería bueno si tuviera la lista de aceptadosHEADERS
, o los quecontent-types
requierenOPTIONS
, etc. pero es un buen comienzoEncontré que la forma más fácil es usar el paquete node.js cors . El uso más simple es:
Por supuesto, hay muchas formas de configurar el comportamiento según sus necesidades; La página vinculada anteriormente muestra una serie de ejemplos.
fuente
cors({credentials: true, origin: true})
Intente pasar el control a la siguiente ruta coincidente. Si Express coincide primero con la ruta app.get, entonces no continuará en la ruta de opciones a menos que haga esto (tenga en cuenta el uso de next) :
En términos de organizar las cosas CORS, lo puse en un middleware que funciona bien para mí:
fuente
config.allowedDomains
una cadena delimitada por comas o una matriz?Para mantenerse en la misma idea de enrutamiento. Yo uso este código:
Similar al ejemplo de http://enable-cors.org/server_expressjs.html
fuente
hacer
y simplemente agregue estas líneas en su archivo principal donde va su solicitud (consérvela antes de cualquier ruta).
fuente
app.options('*', cors())
// incluir antes de otras rutasHe hecho un middleware más completo adecuado para express o connect. Admite
OPTIONS
solicitudes de verificación previa al vuelo. Tenga en cuenta que permitirá el acceso de CORS a cualquier cosa, es posible que desee realizar algunas verificaciones si desea limitar el acceso.fuente
instale el módulo cors de expressjs. puedes seguir estos pasos>
Instalación
Uso simple (Habilitar todas las solicitudes CORS)
Para obtener más detalles, visite https://github.com/expressjs/cors
fuente
TypeError: Cannot read property 'headers' of undefined
La configuración de la aplicación más básica.Haz algo como esto:
fuente
Pruebas realizadas con express + node + ionic corriendo en diferentes puertos.
Localhost:8100
Localhost:5000
fuente
primero simplemente instale cors en su proyecto. Tome la terminal (símbolo del sistema) y
cd
el directorio de su proyecto y ejecute el siguiente comando:Luego tome el archivo server.js y cambie el código para agregar lo siguiente:
Esto funcionó para mí ...
fuente
cors
si estás haciendo lasres.header
cosas.cors
es una biblioteca que maneja todo eso por ti. Elimine su primera y tercera línea (también conocido como todo concors
) y verá que todavía funciona.res.header("Access-Control-Allow-Origin", "*");
Esto funciona para mí, ya que es una implementación fácil dentro de las rutas, estoy usando meanjs y funciona bien, safari, cromo, etc.
fuente
Hace algún tiempo, me enfrenté a este problema, así que hice esto para permitir CORS en mi aplicación nodejs:
Primero necesitas instalar
cors
usando el siguiente comando:Ahora agregue el siguiente código al archivo de inicio de su aplicación como (
app.js or server.js
)fuente
En mi
index.js
agregué:fuente
Access-Control-Allow-Origin = *
significa que no podrá enviar Cookies al servidor, serán rechazadas por la Política CORS - fuente: developer.mozilla.org/en-US/docs/Web/HTTP/… . Por lo tanto, no use esto si desea usar cookies.Si desea que sea específico para el controlador, puede usar:
Tenga en cuenta que esto también permitirá iframes.
fuente
Puede referir el siguiente código para lo mismo. Fuente: Academind / node-restful-api
fuente
const app = express();
y funciona. Creo que es importante mencionarlo.Mi solución más simple con Express 4.2.0 (EDITAR: no parece funcionar en 4.3.0) fue:
Supongo que hacer
app.all('/result', ...)
funcionaría también ...fuente
La respuesta más fácil es usar el paquete cors .
Eso habilitará CORS en todos los ámbitos. Si desea aprender cómo habilitar CORS sin módulos externos , todo lo que realmente necesita es un middleware Express que establezca el encabezado 'Access-Control-Allow-Origin' . Eso es lo mínimo que necesita para permitir dominios de solicitud cruzada desde un navegador a su servidor.
fuente
Usar Express Middleware funciona muy bien para mí. Si ya está utilizando Express, simplemente agregue las siguientes reglas de middleware. Debería comenzar a funcionar.
Referencia
fuente
A continuación funcionó para mí, ¡espero que ayude a alguien!
Obtuve referencia de https://expressjs.com/en/resources/middleware/cors.html#configuring-cors
fuente
Me pareció extremadamente fácil hacer esto con el paquete de solicitud npm ( https://www.npmjs.com/package/request )
Luego basé mi solución en esta publicación http://blog.javascripting.com/2015/01/17/dont-hassle-with-cors/
fuente
En mecanografiado, si desea utilizar el paquete node.js cors
Si no desea utilizar bibliotecas de terceros para el manejo de errores de cors, debe cambiar el método handleCORSErrors ().
Para usar el archivo app.ts
fuente
Esto es similar a la respuesta de Pat con la diferencia que termino con res.sendStatus (200); en lugar de next ();
El código capturará todas las solicitudes del tipo de método OPTIONS y devolverá los encabezados de control de acceso.
El código acepta CORS de todos los orígenes según lo solicitado en la pregunta. Sin embargo, sería mejor reemplazar el * con un origen específico, es decir, http: // localhost: 8080 para evitar el mal uso.
Como usamos el método app.options en lugar del método app.use, no necesitamos hacer esta comprobación:
que podemos ver en algunas de las otras respuestas.
Encontré la respuesta aquí: http://johnzhang.io/options-request-in-express .
fuente
Puede usar el middleware Express, bloquear su dominio y métodos.
fuente
Podemos evitar CORS y reenviar las solicitudes al otro servidor:
fuente
Utilicé los siguientes pasos para mi aplicación web y tuve éxito:
Agregue el paquete cors al expreso:
Agregue las siguientes líneas después de la configuración de bodyParser . Tuve algunos problemas para agregar antes de bodyParser:
fuente
El enfoque más simple es instalar el módulo cors en su proyecto usando:
Luego, en el archivo del servidor, impórtelo utilizando lo siguiente:
Luego, simplemente utilícelo como un middleware como este:
¡Espero que esto ayude!
fuente
Si fuera usted @OP, cambiaría mi paradigma de programación.
asumiendo que está bloqueando estos CORS porque está haciendo solicitudes a localhost o algo similar.
Eventualmente, si va a implementar optoins de producción como
Google Cloud Platform
orHeroku
o, no tendrá que preocuparse por CORS como permitir origen o lo que sea cuando esté en producción.así que cuando pruebe el servidor simplemente use
postman
y no se bloqueará CORS, luego implemente su servidor y luego trabaje en su cliente.fuente
/ * en primer lugar, y este podría ser el problema entre los desarrolladores junior, como yo: ¡asegúrese de usar "lambda" >>>> "` "y no" '"en su método de búsqueda ! * /
`` `respuesta const = await fetch (
https://api....
);/ plus, el siguiente artículo es muy recomendable: https://developer.edamam.com/api/faq /
fuente
lo simple es difícil:
fuente
Pruebe esto en su archivo js principal:
Esto debería solucionar tu problema
fuente