Permitir la solicitud CORT REST a una aplicación Express / Node.js en Heroku

Escribí una API REST en el marco express para node.js que funciona para las solicitudes de la consola js en Chrome, y la barra de URL, etc. Ahora estoy tratando de hacer que funcione para las solicitudes de otra aplicación, en una diferente dominio (CORS).

La primera solicitud, hecha automáticamente por el front-end de javascript, es / api / search? Uri =, y parece estar fallando en la solicitud de OPCIONES “preflight”.

En mi aplicación expresa, 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

Encabezados de solicitud

 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 

¿Esto parece una falta de encabezados adecuados enviados por la aplicación API?

Gracias.

He marcado tu código en una aplicación ExpressJS limpia y funciona muy bien.

Intenta mover tu app.use(allowCrossDomain) a la parte superior de la función de configuración.

para admitir cookies conCredentials necesita esta línea xhr.withCredentials = true;

mdn docs xhr.withCredentials

En el servidor Express, agregue este bloque antes que el rest

 `app.all('*', function(req, res, next) { var origin = req.get('origin'); res.header('Access-Control-Allow-Origin', origin); res.header("Access-Control-Allow-Headers", "X-Requested-With"); res.header('Access-Control-Allow-Headers', 'Content-Type'); next(); });` 

No podría ser el caso para la mayoría de las personas que buscan esta pregunta, pero tuve exactamente este mismo problema y la solución no estaba relacionada con CORS .

Resulta que la string secreta JSON Web Token no se definió en las variables de entorno, por lo que no se pudo firmar el token. Esto provoca que cualquier solicitud POST que dependa de verificar o firmar un token obtenga un tiempo de espera y devuelva un error 503 , indicando al navegador que hay algo mal en CORS , que no es así. Agregar la variable de entorno en Heroku resolvió el problema.

Espero que esto ayude a alguien.