2014-11-29 9 views
14

Ho faticato per 2 giorni su questo, su google e stackover sono riuscito a fare tutto il possibile, ma non riesco a risolverlo.ExpressJS: res.redirect() non funziona come previsto?

Sto costruendo una semplice applicazione di nodo (+ Express + Mongoose) con una pagina di accesso che reindirizza alla pagina iniziale. Ecco il mio server di codice Caffè:

app 
    .get '/', (req, res) -> 
     console.log "Here we are : root" 
     res.sendfile(__dirname + '/index.html') 


    .get '/login', (req, res) -> 
     console.log "Here we are : '/login'" 
     res.sendfile(__dirname + '/login.html') 


    .post '/credentials', (req, res) -> 
     console.log "Here we are : '/credentials'" 

     # (here comes credentials validation stuff with Mongoose) 

     res.redirect '/' 

La pagina di login fa una richiesta POST/credenziali, in cui si verifica dei dati pubblicati. Questo funziona. Riesco a vedere "Qui siamo: '/ credenziali'" nella console del nodo.

Quindi viene il problema: il res.redirect non funziona correttamente. So che non raggiunge il percorso '/', perché:

  1. posso vedere "Ci siamo: root" nella console Nodo
  2. La pagina index.html viene inviato al browser come risposta, ma non visualizzato nella finestra. Chrome inspector mostra la risposta alla richiesta POST, POSSO vedere il codice HTML inviato al browser nell'ispettore, ma l'URL rimane/login e la pagina di accesso è ancora visualizzata sullo schermo.

(Edit) Il reindirizzamento è in funzione callback Mongoose, non è sincrona (come NodeJS dovrebbero essere). Ho appena rimosso roba di convalida di Mongoose per chiarezza.

Ho provato ad aggiungere res.end(), non funziona

ho cercato

req.method = 'get'; 
res.redirect('/'); 

e

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

Non funziona

Che cosa sto facendo di sbagliato? Come posso effettivamente lasciare la pagina '/ login', reindirizzare il browser a '/' e visualizzare il codice HTML che ha ricevuto?

Grazie mille per il vostro aiuto in anticipo :)

+1

Stai effettivamente chiamando la pagina delle credenziali nel tuo browser o stai facendo una richiesta AJAX? – mvuajua

+1

Hai mai capito cosa stava succedendo qui? Sto avendo lo stesso problema, convalida il reindirizzamento delle credenziali non funziona per una rotta specificata come GET, nel mio caso il profilo dell'utente. – OliverJ90

+0

No, non l'ho mai capito. Ho finito per costruire la mia app in modo diverso, con la parte di login in un modal, invece di un'altra pagina ... Molto frustrante –

risposta

0

E 'quasi certo che si stanno facendo una chiamata asincrona per controllare Mangusta, ma non è stato strutturato il codice in modo che il reindirizzamento avviene solo dopo la chiamata asincrona rendimenti un risultato.

in JavaScript, il POST sarebbe simile qualcosa di questo:

function validateCredentials(user, callback){ 
    // takes whatever you need to validate the visitor as `user` 
    // uses the `callback` when the results return from Mongoose 
} 

app.post('/credentials', function(req, res){ 
    console.log("Here was are: '/credentials'"; 
    validateCredentials(userdata, function(err, data){ 
     if (err) { 
      // handle error and redirect to credentials, 
      // display an error page, or whatever you want to do here... 
     } 
     // if no error, redirect 
     res.redirect('/'); 
    }; 
}; 

È anche possibile vedere domande come Async call in node.js vs. mongoose in parallelo/problemi legati ...

+0

Ho dimenticato di dirlo, ma ho fatto il reindirizzamento nella funzione di callback. Ho appena rimosso materiale di Mongoose per chiarezza. Ma darò una prova alla tua architettura, grazie :) –

+0

Se non stai postando il codice che è direttamente circostante e relativo al problema ... Non sono sicuro di come otterrai una risposta. –

+2

Mi dispiace per quello. Ho rimosso con precisione il codice che ritengo non sia correlato al mio problema. La validazione funziona, e 'res.redirect ('/')' in realtà invia al percorso '/'. Quindi credo che Mongoose non sia in causa qui, quindi per chiarezza ho rimosso questa parte. –

0

Aggiungere il seguente nella vostra get/percorso:

res.setHeader("Content-Type", "text/html") 

Il tuo browser renderà file invece di scaricarlo

7

Il problema potrebbe non essere il backend, ma con il frontend. Se si utilizza AJAX per inviare la richiesta POST, è specificamente progettato per non modificare l'URL.

Usa window.location.href dopo la richiesta di AJAX ha completato (nel .done()) per aggiornare l'URL con il percorso desiderato, o utilizzare JQuery: $('body').replaceWith(data) quando si riceve il codice HTML indietro dalla richiesta.

+1

Grazie per la risposta, ma questa è ora una vecchia domanda e non sto più usando jQuery. Sono passato a Angular 1 e Angular 2/4 molto tempo fa, quindi non ho più questo problema :) Grazie comunque –

+0

ho visto che questa era una vecchia domanda ma era un risultato comune per la ricerca, quindi io Ho pensato di rispondere a tutte le persone che ancora cercano questa soluzione. – Kelrynn

+0

'window.location.assign ('/ newPath')' reindirizza la pagina corrente a http: // localhost: 3000/newPath, che ha funzionato per il mio caso. – Progoogler

Problemi correlati