Una implementación altamente configurable y compatible con middleware de CORS para Node.js.
Access-Control-Request-Headers
vacío.OPTIONS
, marque la opción endPreflightRequests
.(err, matches)
en lugar de solo (matches)
. Consulte example/express/
para ver un ejemplo práctico.
var express, corser, app;
express = require("express");
corser = require("corser");
app = express();
app.use(corser.create());
app.get("/", function (req, res) {
res.writeHead(200);
res.end("Nice weather today, huh?");
});
app.listen(1337);
Consulte example/connect/
para ver un ejemplo práctico.
var connect, corser, app;
connect = require("connect");
corser = require("corser");
app = connect();
app.use(corser.create());
app.use(function (req, res) {
res.writeHead(200);
res.end("Nice weather today, huh?");
});
app.listen(1337);
http
simple var http, corser, corserRequestListener;
http = require("http");
corser = require("corser");
// Create Corser request listener.
corserRequestListener = corser.create();
http.createServer(function (req, res) {
// Route req and res through the request listener.
corserRequestListener(req, res, function () {
res.writeHead(200);
res.end("Nice weather today, huh?");
});
}).listen(1337);
Crear un detector de solicitudes de Corser que genere los encabezados de respuesta apropiados para habilitar CORS es tan simple como:
corser.create()
Esto es el equivalente a configurar un encabezado de respuesta de Access-Control-Allow-Origin: *
. Si desea restringir los orígenes o permitir encabezados de solicitud o respuesta más sofisticados, debe pasar un objeto de configuración a corser.create
.
Corser finalizará automáticamente las solicitudes de verificación previa por usted. Una solicitud de verificación previa es una solicitud OPTIONS
especial que el navegador envía bajo ciertas condiciones para negociar con el servidor qué métodos, encabezados de solicitud y encabezados de respuesta están permitidos para una solicitud CORS. Si necesita usar el método OPTIONS
para otras cosas, simplemente configure endPreflightRequests
en false
y finalice esas solicitudes usted mismo:
var corserRequestListener;
corserRequestListener = corser.create({
endPreflightRequests: false
});
corserRequestListener(req, res, function () {
if (req.method === "OPTIONS") {
// End CORS preflight request.
res.writeHead(204);
res.end();
} else {
// Implement other HTTP methods.
}
});
Se puede pasar un objeto de configuración con las siguientes propiedades a corser.create
.
origins
Una lista blanca de orígenes que distingue entre mayúsculas y minúsculas. Si la solicitud proviene de un origen que no está en esta lista, CORS no la manejará. Para aceptar todos los orígenes (el comportamiento Access-Control-Allow-Origin: *
), omita la propiedad o configúrela en una matriz vacía ( []
).
Para permitir la verificación dinámica del origen, se puede pasar una función (origin, callback)
en lugar de una matriz. origin
es el encabezado de Origen, callback
es una función (err, matches)
, donde matches
es un indicador booleano que indica si el encabezado de Origen determinado coincide o no.
Predeterminado: se aceptan todos los orígenes.
methods
Una lista blanca de métodos en mayúsculas. Si la solicitud utiliza un método que no está en esta lista, CORS no la manejará.
Establecer un valor aquí sobrescribirá la lista de métodos simples predeterminados. Para no perderlos, concat los métodos que desea agregar con corser.simpleMethods
: corser.simpleMethods.concat(["PUT", "DELETE"])
.
Predeterminado: métodos simples ( GET
, HEAD
, POST
).
requestHeaders
Una lista blanca de encabezados de solicitud que no distingue entre mayúsculas y minúsculas. Si la solicitud utiliza un encabezado de solicitud que no está en esta lista, CORS no la manejará.
Establecer un valor aquí sobrescribirá la lista de encabezados de solicitud simples predeterminados. Para no perderlos, concat los encabezados de solicitud que desea agregar con corser.simpleRequestHeaders
: corser.simpleRequestHeaders.concat(["Authorization"])
.
Valor predeterminado: encabezados de solicitud simples ( Accept
, Accept-Language
, Content-Language
, Content-Type
, Last-Event-ID
).
responseHeaders
Una lista blanca de encabezados de respuesta que no distingue entre mayúsculas y minúsculas. Cualquier encabezado de respuesta que no esté en esta lista será filtrado por el agente de usuario (el navegador).
Establecer un valor aquí sobrescribirá la lista de encabezados de respuesta simples predeterminados. Para no perderlos, concatene los encabezados de respuesta que desea agregar con corser.simpleResponseHeaders
: corser.simpleResponseHeaders.concat(["ETag"])
.
Valor predeterminado: encabezados de respuesta simples ( Cache-Control
, Content-Language
, Content-Type
, Expires
, Last-Modified
, Pragma
).
supportsCredentials
Un valor booleano que indica si las credenciales de cookies se pueden transferir como parte de una solicitud CORS. Actualmente, sólo unos pocos elementos HTML5 pueden beneficiarse de esta configuración.
Valor predeterminado: false
.
maxAge
Un número entero que indica la cantidad máxima de tiempo en segundos que una solicitud de verificación previa se mantiene en la caché de resultados de verificación previa del lado del cliente.
Valor predeterminado: no establecido.
endPreflightRequests
Un valor booleano que indica si las solicitudes de verificación previa de CORS deben cerrarse automáticamente.
Valor predeterminado: true
.
Origin X is not allowed by Access-Control-Allow-Origin
Compruebe si el encabezado Origin
de su solicitud coincide con uno de los orígenes proporcionados en la propiedad origins
del objeto de configuración. Si no estableció ninguna propiedad origins
, pase a la siguiente pregunta.
Si eso no ayuda, su solicitud podría utilizar un método no simple o uno o más encabezados no simples (consulte la siguiente pregunta). Según la especificación, el conjunto de métodos simples es GET
, HEAD
y POST
, y el conjunto de encabezados de solicitud simples es Accept
, Accept-Language
, Content-Language
, Content-Type
y Last-Event-ID
. Si su solicitud utiliza cualquier otro método o encabezado, debe enumerarlos explícitamente en los methods
o en la propiedad requestHeaders
del objeto de configuración.
Desea permitir solicitudes que utilicen un encabezado X-Requested-With
. Pase el siguiente objeto de configuración a corser.create
:
corser.create({
requestHeaders: corser.simpleRequestHeaders.concat(["X-Requested-With"])
});
Request header field Content-Type is not allowed by Access-Control-Allow-Headers
Una configuración predeterminada solo funcionará si el cliente envía una solicitud "simple", es decir, GET
, HEAD
, POST
como método y algunos encabezados como Accept
, Accept-Language
, Content-Language
y Content Content-Type
Content-Type
, etc. Content-Type
tiene una restricción importante: solo se permiten application/x-www-form-urlencoded
, multipart/form-data
y text/plain
.
Normalmente, el Content-Type
de una API será application/json
y esto no está permitido de forma predeterminada. Content-Type
debe especificarse explícitamente en el objeto de configuración bajo la clave requestHeaders
:
corser.create({
requestHeaders: corser.simpleRequestHeaders.concat(["Content-Type"])
});
Refused to get unsafe header "X"
Su navegador bloquea todos los encabezados de respuesta no simples que no se permitieron explícitamente en la solicitud de verificación previa. El conjunto de encabezados de respuesta simples es Cache-Control
, Content-Language
, Content-Type
, Expires
, Last-Modified
, Pragma
. Si desea acceder a cualquier otro encabezado de respuesta, debe enumerarlo explícitamente en la propiedad responseHeaders
del objeto de configuración.
Quiere permitir que los clientes lean el encabezado ETag
de una respuesta. Pase el siguiente objeto de configuración a corser.create
:
corser.create({
responseHeaders: corser.simpleResponseHeaders.concat(["ETag"])
});