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:
(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 :)
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.
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
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.
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 ...