2015-11-10 15 views
5

https://github.com/hwz/chirp/blob/master/module-5/completed/routes/api.jsritorno next() in confusione nodejs

function isAuthenticated (req, res, next) { 
    // if user is authenticated in the session, call the next() to call the next request handler 
    // Passport adds this method to request object. A middleware is allowed to add properties to 
    // request and response objects 

    //allow all get request methods 
    if(req.method === "GET"){ 
     return next(); 
    } 
    if (req.isAuthenticated()){ 
     return next(); 
    } 

    // if the user is not authenticated then redirect him to the login page 
    return res.redirect('/#login'); 
}; 

Perché l'autore fanno return next() invece di next()? So che next() è quello di consentire al flusso di passare al middleware o alla funzione successiva, ma perché è necessario un codice return per next() precedente?

+0

Quindi 'isAuthenticated' restituisce qualunque cosa' next() 'restituisce. Questo potrebbe non essere un valore utile, intendiamoci. –

+2

possibile duplicato di http://stackoverflow.com/questions/16810449/when-to-use-next-and-return-next-in-node-js ma è valida e buona domanda –

+0

Nel contesto di middle-ware espresso è necessario arrestare l'esecuzione di quel pezzo specifico di middleware se dovesse cadere in una di quelle istruzioni if. Chiamando 'next' dice express 'im done here move on' comunque senza il' return' potrebbe chiamare 'next' ma poi prova anche ad eseguire un reindirizzamento. – ste2425

risposta

1

È una convenzione per anteporre un valore a return per uscire dalla funzione. L'alternativa sarebbe utilizzare if-else if-else anziché solo if. In questo caso, devi solo uscire dalla funzione e andare oltre sulla catena del middleware.

Vedrai questo schema abbastanza spesso. Ad esempio, questo è abbastanza comune:

someFunction(function(err, result) { 
    if (err) { 
     return console.error(err); 
    } 

    console.log(result); 
}); 

E 'meno di nidificazione e legge più facile alla maggior parte dei poeple rispetto a questo:

someFunction(function(err, result) { 
    if (err) { 
     console.error(err); 
    } else { 
     console.log(result); 
    } 
}); 

Il primo modello che mantiene anche di chiamare accidentalmente next() due volte o anche più volte in caso di errori nel tuo if-else -logic. E questo è esattamente ciò che non dovrebbe accadere con next() in quel caso che hai postato. Potrebbe chiamare next() e causare comunque il reindirizzamento in ogni caso.

+0

sta rispondendo alla domanda? So cosa fa next() ma perché return next(), questa è la mia domanda –

+0

Questo è esattamente quello che sto spiegando nella mia risposta, sì. È solo per uscire dal metodo in quel punto per evitare ulteriori chiamate. È un modello. Non ha nulla a che fare con 'next()' davvero. È principalmente dovuto alla natura di _callback hell_. –