ExpressJS : res.redirect() werkt niet zoals verwacht?

Ik heb hier twee dagen mee geworsteld, gegoogled en alles overlopen wat ik kon, maar ik kom er niet uit.

Ik bouw een eenvoudige node-app (+Express + Mongoose) met een inlogpagina die doorverwijst naar de startpagina. Hier is mijn server JS-code:

app
    .get('/', (req, res) => {
        console.log("Here we are : root");
        return res.sendfile(__dirname + '/index.html');
    })
    .get('/login', (req, res) => {
        console.log("Here we are : '/login'");
        return res.sendfile(__dirname + '/login.html');
    })
    .post('/credentials', (req, res) => {
        console.log("Here we are : '/credentials'");
        // Some Mongoose / DB validations
        return res.redirect('/');
    });

De inlogpagina doet een POST-verzoek naar /credentials, waar de geplaatste gegevens worden geverifieerd. Dit werkt. Ik zie “Hier zijn we: ‘/credentials'” in de Node-console.

Dan komt het probleem: de res.redirect werkt niet goed. Ik weet dat het de ‘/’-route bereikt, omdat:

  1. Ik zie “Hier zijn we: root” in de Node-console
  2. De index.html-pagina wordt als antwoord teruggestuurd naar de browser, maar wordt niet weergegeven in het venster.
    Chrome-inspecteur toont de reactie op het POST-verzoek, ik KAN zien dat de HTML-code naar de browser wordt verzonden in de inspecteur, maar de URL blijft /login en de inlogpagina wordt nog steeds op het scherm weergegeven.

(Bewerken) De omleiding is in de callback-functie van Mongoose, het is niet synchroon (zoals NodeJS zou moeten zijn). Ik heb zojuist Mongoose-validatiemateriaal verwijderd voor de duidelijkheid.

Ik heb geprobeerd res.end()toe te voegen, werkt niet

Ik heb het geprobeerd

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

en

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

Werkt niet

Wat doe ik verkeerd? Hoe kan ik de ‘/login’-pagina verlaten, de browser omleiden naar ‘/’ en de ontvangen HTML-code weergeven?

Bij voorbaat dank voor uw hulp 🙂


Antwoord 1, autoriteit 100%

Het probleem ligt misschien niet bij de backend, maar bij de frontend. Als u AJAX gebruikt om het POST-verzoek te verzenden, is het speciaal ontworpen om uw url niet te wijzigen.

Gebruik window.location.hrefnadat het verzoek van AJAX is voltooid (in de .done()) om de URL bij te werken met het gewenste pad, of gebruik JQuery: $('body').replaceWith(data)wanneer u de HTML van het verzoek ontvangt.


Antwoord 2, autoriteit 2%

Als u een asynchroon verzoek naar de backend gebruikt en vervolgens omleidt in de backend, wordt deze omgeleid in de backend (dwz er wordt een nieuw get-verzoek naar die URL gemaakt), maar de URL in de frontend wordt niet gewijzigd.

p>

Om het te laten werken:

  1. gebruik windows.location.href = "/url"
  2. wijzig uw async-verzoek (in front-end) in een eenvoudige ankertag (<a></a>)

Antwoord 3

Het is bijna zeker dat je een asynchrone aanroep doet om Mongoose te controleren, maar je hebt de code niet zo gestructureerd dat de omleiding pas plaatsvindt nadat de asynchrone aanroep een resultaat oplevert.

In javascript ziet de POSTer ongeveer zo uit:

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

Je kunt ook vragen zien zoals Async-aanroep in node.js vs. mangoest voor parallelle/gerelateerde problemen…


Antwoord 4

Voeg het volgende toe aan je get / route:

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

Uw browser zal het bestand renderen in plaats van het te downloaden


Antwoord 5

Ik heb gewerkt aan het implementeren van nodemailer in mijn NextJS-app met Express. Had dit probleem en kwam dit tegen. Ik had event.preventDefault() in mijn functie die het formulier afvuurde om in te dienen en dat ook de omleiding verhinderde, ik heb het verwijderd en het werd dienovereenkomstig omgeleid.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes