2016-05-19 32 views
6

Nel nodo con Express, ho un pezzo di codice come questo.In Express.js perché il codice dopo res.json() viene ancora eseguito?

if (req.body.var1 >= req.body.var2){ 
     res.json({success: false, message: "End time must be AFTER start time"}); 
     console.log('Hi') 
} 
console.log('Hi2') 
//other codes 

Mi aspettavo che se var1 fosse> = var2, la risposta sarebbe stata inviata e l'esecuzione sarebbe terminata. Come dichiarazioni di ritorno in Java/C#

Ma apparentemente non è questo il caso. Dopo che la risposta è stata inviata, sia "Hi" che "Hi2" e tutto il resto del codice continuano a essere eseguiti.

Mi chiedevo come avrei impedito che ciò accadesse?

Inoltre, mi chiedevo in quali circostanze vorresti effettivamente che il codice continuasse ad essere eseguito dopo che una risposta è già stata inviata.

Acclamazioni

risposta

9

espresso chiama solo una funzione JavaScript per il percorso corrispondente. Non c'è magia speciale da sapere quando la funzione è completa/incompleta. Esegue semplicemente la funzione. Tuttavia, è molto semplice uscire dalla funzione ogni volta che lo si desidera ...

È possibile utilizzare return per interrompere l'esecuzione della richiamata per un percorso specifico in espresso. E 'solo JavaScript ... la funzione cercherà sempre di correre fino al completamento

app.post('/some/route', (req, res)=> { 
    if (req.body.var1 >= req.body.var2){ 
    // note the use of `return` here 
    return res.json({success: false, message: "End time must be AFTER start time"}); 
    // this line will never get called 
    console.log('Hi') 
    } 
    // this code will only happen if the condition above is false 
    console.log('Hi2') 
    //other codes 
}); 

Avvertimento in comparsion stringa

Stai usando

req.body.var1 >= req.body.var2 

Tutti i valori di form HTML vengono inviati al il server come stringhe.

// javascript string comparison 
"4" > "3" //=> true 
"4" > "30" //=> true 
parseInt("4", 10) > parseInt("30", 10) //=> false 

Sono certo che sarà necessario fare un confronto più istruito di quello. Sembra che siano valori temporali? Quindi probabilmente vorrai convertire quei valori in oggetti Date e fare un confronto accurato.

+1

Sì, sono valori interi per secondi. Grazie per l'avviso! Suppongo che avrò bisogno di analizzarli come hai fatto tu? Non sapevo che tutto è stato inviato come stringhe. Questo potrebbe aver causato un sacco di mal di testa lungo la linea. Grazie mille. – Synia

5

Basta tornare dopo la funzione res.json:

res.json({success: false, message: "End time must be AFTER start time"}); 
return; // This will stop anything else from being run 
0

È possibile tornare con res.json troppo.

if (req.body.var1 >= req.body.var2){ 
return res.status(400).json({success: false, message: 'your message'}) 
}