Pregunta 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.


76
2018-06-12 17:33


origen


Respuestas:


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

Intenta moverte app.use(allowCrossDomain) en la parte superior de la función de configuración.


51
2018-06-15 20:16



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 resto

`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();
});`

3
2017-09-15 08:08



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 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 causó a cualquier POST solicitud que se basa en verificar o firmar un token para obtener un tiempo de espera y devolver un 503 error, diciéndole al navegador que hay algo mal en CORSque no es Agregar la variable de entorno en Heroku resolvió el problema.

Espero que esto ayude a alguien.


0
2017-07-18 00:05