Escribí una API REST en el marco expreso para node.js que funciona para solicitudes de la consola js en Chrome y la barra de URL, etc. Ahora estoy tratando de que funcione para solicitudes de otra aplicación, en una diferente dominio (CORS).
La primera solicitud, realizada automáticamente por el front-end de JavaScript, es / api / search? Uri =, y parece fallar en la solicitud OPTIONS de "verificación previa".
En mi aplicación express, estoy agregando encabezados CORS, usando:
var allowCrossDomain = function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
// intercept OPTIONS method
if ('OPTIONS' == req.method) {
res.send(200);
}
else {
next();
}
};
y:
app.configure(function () {
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(allowCrossDomain);
app.use(express.static(path.join(application_root, "public")));
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
Desde la consola de Chrome obtengo estos encabezados:
URL de solicitud: http: //furious-night-5419.herokuapp.com/api/search? Uri = http% 3A% 2F% 2Flocalhost% 3A5000% 2Fcollections% 2F1% 2Fdocuments% 2F1
Método de solicitud: OPCIONES
Código de estado: 200 OK
Solicitar encabezados
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:origin, x-annotator-auth-token, accept
Access-Control-Request-Method:GET
Connection:keep-alive
Host:furious-night-5419.herokuapp.com
Origin:http://localhost:5000
Referer:http://localhost:5000/collections/1/documents/1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5
Parámetros de cadena de consulta
uri:http://localhost:5000/collections/1/documents/1
Encabezados de respuesta
Allow:GET
Connection:keep-alive
Content-Length:3
Content-Type:text/html; charset=utf-8
X-Powered-By:Express
¿Parece esto una falta de encabezados adecuados enviados por la aplicación API?
Gracias.
OPTIONS
método. Podría alguien por favor me ayude a entender por qué no manejar sólo elPOST
método en lugar de manejar tantoPOST
yOPTIONS
método?PATCH
si lo usará en lugar dePUT
actualizar un recursoRespuestas:
Verifiqué su código en una aplicación ExpressJS limpia y funciona bien.
Intente mover su
app.use(allowCrossDomain)
a la parte superior de la función de configuración.fuente
app.use(app.router);
Cheers!para admitir cookies con credenciales, necesita esta línea
xhr.withCredentials = true;
mdn docs xhr.withCredentials
En Express Server agregue este bloque antes que todos los demás
fuente
Estoy agregando esto como respuesta solo porque la publicación original se incluyó como un comentario y, como tal, los suyos lo pasaron por alto la primera vez que revisé esta página.
Como @ConnorLeech señala en su comentario a la respuesta aceptada anterior, hay un paquete npm muy útil llamado, como era de esperar, cors . Su uso es tan simple como
var cors = require('cors'); app.use(cors());
(nuevamente, extraído de la respuesta del Sr. Leech) y también se puede aplicar de una manera más estricta y configurable, como se describe en sus documentos .También puede valer la pena señalar que el comentario original al que me refiero anteriormente se realizó en 2014. Ahora es 2019 y, al mirar la página de github del paquete npm, el repositorio se actualizó hace tan solo nueve días.
fuente
No podría ser el caso para la mayoría de las personas que consultan esta pregunta, pero tuve exactamente el mismo problema y la solución no estaba relacionada con
CORS
.Resulta que el secreto de JSON Web Token
string
no se definió en las variables de entorno, por lo que el token no se pudo firmar. Esto provocó que cualquierPOST
solicitud que se basara en verificar o firmar un token para obtener un tiempo de espera y devolver un503
error, le dice al navegador que hay algo mal enCORS
, que no es así. Agregar la variable de entorno en Heroku resolvió el problema.Espero que esto ayude a alguien.
fuente
app.use(cors());
.