javascript - mega - notificaciones en tiempo real node js




Sesiones Express con AngularJS (2)

Entonces, si configuro correctamente, tienes:

angularjs running on grunt server <---> express server

¿Y quieres acceder a la sesión en el servidor express? Si este es el caso, entonces necesita una forma de compartir la sesión entre esos dos servidores. Yo recomendaría usar el módulo redis-connect (también hay express-mongodb). Almacena el objeto de sesión en una base de datos redis a la que se puede acceder desde ambos servidores. Nunca antes había usado el servidor grunt, pero lo he hecho usando dos servidores Express. MemoryStore no funcionará aquí, porque tiene dos procesos separados que no compartirán la misma memoria.

Intento crear un inicio de sesión simple utilizando express y angularjs. La aplicación angular js se ejecuta en un servidor separado (servidor local roncado: 9000) mientras que la aplicación expresa se ejecuta en otro puerto. Para mi aplicación express, tengo los siguientes conjuntos de encabezados:

app.all('/*', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "http://localhost:9000");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
  res.header("Access-Control-Allow-Credentials", "true");
  next();
});

Estoy ejecutando angular 1.0.7, lo que significa que puedo establecer algunos valores predeterminados en el paso de configuración:

// Add COR ability
$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];

Y el conCredentials en la solicitud de $ http:

$http({
   method : "GET",
   withCredentials : true,
   url : apiEndpoint + '/session'
}, success);

Entonces, después de iniciar sesión con mi aplicación, se crea una sesión y se puede ver una cookie en la respuesta. Usando las herramientas de depuración de Chrome, puedo ver que la cookie de sesión de conexión se envía con la siguiente solicitud subsiguiente (la llamada de la sesión anterior). En el servidor, sin embargo, la propiedad req.session todavía está vacía. Por supuesto, podría simplemente alojar la aplicación angular con Express y sortear todo esto, pero preferiría mantener los dos proyectos / servidores separados.

Esta es una vista de la solicitud /session , con la cookie de sesión de conexión adjunta a la solicitud:


Tuve que meterme con algunas cosas diferentes para que esto funcione. Primero, actualicé al borde angular, ya que algunos valores no podían ser predeterminados globalmente en $ http que necesitaba.

En el paso angular config() , agregué:

// Add COR ability
$httpProvider.defaults.useXDomain = true;
$httpProvider.defaults.withCredentials = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];

En expreso, creé un middleware angular:

exports.angularHeaders = function(req, res, next){
    res.header("Access-Control-Allow-Origin", '{{insert your ui endpoint}}');
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
    res.header("Access-Control-Allow-Credentials", "true");
    next();
};




cors