2011-11-23 10 views
9

que estoy tratando de hacer lo siguiente:js Express - no puede redirigir

desde el cliente

var req = jQuery.post(
    "http://www.example.com:3000"+"/dologin", 
    {"username" : username, "password" : password}).error(function(){ 
    alert("an error occurred"); 
    }); 

en la raíz expreso

app.post('/dologin',function(req, res) { 
    res.redirect('http://bbc.co.uk'); 
}); 

resultado devuelto

<p>Moved Temporarily. Redirecting to <a href="http://bbc.co.uk">http://bbc.co.uk</a></p> 

Parece que si publico desde jquery la redirección no funcionará. ¿Alguien sabe una forma de obligarlo a redirigir?

Respuesta

19

navegador no redirige la ventana de redireccionamiento de la respuesta Ajax. Redirecciona el navegador con javascript.

En el servidor, envíe el nuevo sitio como contenido, por ejemplo.

res.contentType('application/json'); 
var data = JSON.stringify('http://site.example.com/') 
res.header('Content-Length', data.length); 
res.end(data); 

En el cliente

var req = jQuery.post(
    "http://www.mysite.com:3000"+"/dologin", 
    {"username" : username, "password" : password}, 'json').error(function(){ 
     alert("an error occurred"); 
    }).success(function(data) { 
     window.location = data; 
    }); 
+0

Gracias eso es lo que terminé haciendo, gracias por la aclaración. Esperaba que reemplazaran el tipo de solicitud en el servidor. 'alessioalex sugirió req.method = 'get'; pero eso no funcionó para mí. – Chin

+1

El tipo de solicitud de anulación no importa, el navegador no redirigirá la ubicación de la ventana si recibe una respuesta de redireccionamiento a la solicitud de Ajax (por ejemplo, $ .post o $ .get). por cierto. ¿Puedes aceptar mi respuesta si crees que está bien? –

14

En realidad, me he encontrado con lo mismo al desarrollar una aplicación. Parece que Express no redirige si el método es posterior.

Probar:

app.post('/dologin',function(req, res) { 
    req.method = 'get'; 
    res.redirect('http://bbc.co.uk'); 
}); 
+1

Gracias, lamentablemente no lo solucionó. Creo que lo cambiaré a un get de jquery, esencialmente estoy intentando configurar un formulario de inicio de sesión que (en caso de error envía un poco de json describiendo el problema y en los redireccionamientos de éxito a otra página en el sitio) – Chin

+0

Eso es extraño , Acabo de hacer una prueba en un sitio con mi solución anterior y funcionó.¿Estás seguro de que estás configurando el método requerido para 'obtener' y no el método de recuperación ...? – alessioalex

+0

sí - using express 2.5 function (req, res) { req.method = 'get'; res.redirect ('http://bbc.co.uk'); – Chin

0

que estoy haciendo algo como esto cuando se utiliza OAuth2. Tengo un enlace a una de mis páginas y esto a su vez redirige a google.

Para redirigir a otro lugar el siguiente código redirige el actual

app.get('/GoogleRequestAuthorization.html',function(req,res) { 
. 
. 
. 
. 

res.writeHead(302, {location: url}); 
res.end(); 

}),

url es la dirección a la que desea volver a dirigir.

La función completa es ...

0

que han llegado a un problema similar y lo resolvió mediante la comprobación del tipo de la solicitud. En mi caso uso de JSON, sino funciona para otras peticiones POST así:

   var ajax = req.xhr; 
       if(ajax) { 
        res.status(401).json({'msg':'redirect','location':'/login'}); 
       } 
       else { 
        req.method = 'get'; 
        res.status(401).redirect('/login'); 
        //Or if you prefer plain text 
        //res.status(333).send("Redirect"); 
       } 

Este maneja tanto el Ajax POST y AJAX y peticiones GET estándar. En el cliente, en el Ajax de devolución de llamada respose:

$.ajax({ 
     type: 'POST', 
     data: Msg, 
     url: '/some/post', 
     dataType: 'JSON' 
    }).success(function(data, textStatus, req) { 
     if(data.msg==="redirect") window.location = data.location; 
     else {...} 
    }).error(function(data, textStatus, req) { 
     if(req=="Unauthorized") { 
      alert("Unauthorized!"); 
      window.location = "/login"; 
     } else if (data.responseJSON.msg==="redirect") window.location = data.responseJSON.location; 
     else { 
      //... 
     } 
    }); 

En realidad se puede manejar más estados aquí, a excepción de 302, que es seguido automáticamente por jQuery y se obtiene como respuesta 200 desde la página que querías volver a dirigir a . Así que evito enviar el 302, enviando 401 en mi caso, o cualquier otro estado, por ejemplo 333, que se manejará como un error.

Cuestiones relacionadas