web-dev-qa-db-fra.com

ExpressJS: res.redirect () ne fonctionne pas comme prévu?

Cela fait deux jours que je me bats sur ce coup-là, googlé et empilé tout ce que je pouvais, mais je ne peux pas régler le problème.

Je construis une application de nœud simple (+ Express + Mongoose) avec une page de connexion qui redirige vers la page d'accueil. Voici le code café de mon serveur:

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 page de connexion envoie une demande POST à/credentials, où les données publiées sont vérifiées. Cela marche. Je peux voir "Nous sommes ici: '/ credentials'" dans la console Node.

Vient ensuite le problème: le res.redirect ne fonctionne pas correctement. Je sais qu'il atteint la route '/', parce que:

  1. Je peux voir "Nous sommes ici: root" dans la console Node
  2. La page index.html est renvoyée au navigateur sous forme de réponse, mais ne s'affiche pas dans la fenêtre . L'inspecteur Chrome affiche la réponse à la demande POST, je peux voir le code HTML envoyé au navigateur dans l'inspecteur, mais l'URL reste/login et la page de connexion est toujours affichée à l'écran.

(Edit) La redirection est dans la fonction de rappel de Mongoose, ce n'est pas synchrone (comme devrait l'être NodeJS). Je viens de supprimer des éléments de validation Mongoose pour plus de clarté.

J'ai essayé d'ajouter res.end(), cela ne fonctionne pas

J'ai essayé

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

et

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

Ça ne marche pas

Qu'est-ce que je fais mal? Comment puis-je quitter la page '/ login', rediriger le navigateur vers '/' et afficher le code HTML reçu?

Merci mille fois pour votre aide d'avance :)

19
Jeremy Thille

Le problème ne réside peut-être pas dans le backend, mais dans le front-end. Si vous utilisez AJAX pour envoyer la demande POST, il est spécifiquement conçu pour ne pas modifier votre URL. 

Utilisez window.location.href une fois que la demande d'AJAX est terminée (dans la .done()) pour mettre à jour l'URL avec le chemin souhaité, ou utilisez JQuery: $('body').replaceWith(data) lorsque vous recevez le code HTML de la demande.

22
Kelrynn

Ajoutez ce qui suit dans votre get/route:

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

Votre navigateur rendra le fichier au lieu de le télécharger

0
Daphoque

Je travaille sur l'implémentation de nodemailer dans mon application NextJS avec Express. Avait ce problème et est tombé sur cela. J'avais event.preventDefault () dans ma fonction qui renvoyait le formulaire à soumettre et qui empêchait également la redirection, je l'ai enlevé et il était redirigé en conséquence.

0
nicer00ster

Il est presque certain que vous effectuez un appel asynchrone pour vérifier Mongoose, mais vous n'avez pas structuré le code de sorte que la redirection ne se produise que lorsque l'appel async retourne un résultat.

En javascript, la variable POST ressemblerait à quelque chose comme ceci:

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

Vous pouvez également consulter des questions telles que Appel asynchrone dans node.js vs mongoose pour les problèmes parallèles/connexes ...

0
Matthew Bakaitis