Je suis assez nouveau sur Node.js et j'ai des problèmes.
J'utilise Node.js 4.10 et Express 2.4.3.
Lorsque j'essaie d'accéder à http://127.0.0.1:8888/auth/facebook , je serai redirigé vers http://127.0.0.1:8888/auth/facebook_callback .
J'ai ensuite reçu l'erreur suivante:
Error: Can't render headers after they are sent to the client.
at ServerResponse.<anonymous> (http.js:573:11)
at ServerResponse._renderHeaders (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:64:25)
at ServerResponse.writeHead (http.js:813:20)
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/auth.strategies/facebook.js:28:15
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:113:13
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/strategyExecutor.js:45:39)
at [object Object].pass (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/authExecutionScope.js:32:3)
at [object Object].halt (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/authExecutionScope.js:29:8)
at [object Object].redirect (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/authExecutionScope.js:16:8)
at [object Object].<anonymous> (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/auth.strategies/facebook.js:77:15)
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:195:11)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
at param (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:189:13)
at pass (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:191:10)
at Object.router [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:197:6)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
at Object.auth [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:153:7)
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
at param (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:189:13)
at pass (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:191:10)
at Object.router [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:197:6)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
at Object.auth [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:153:7)
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
at Object.auth [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:153:7)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
at HTTPServer.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:211:3)
at Object.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:105:14)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
at HTTPServer.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:211:3)
at Object.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:105:14)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:323:9
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:338:9
node.js:134
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:323:9
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:338:9
at Array.<anonymous> (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session/memory.js:57:7)
at EventEmitter._tickCallback (node.js:126:26)
Voici mon code:
var fbId= "XXX";
var fbSecret= "XXXXXX";
var fbCallbackAddress= "http://127.0.0.1:8888/auth/facebook_callback"
var cookieSecret = "node"; // enter a random hash for security
var express= require('express');
var auth = require('connect-auth')
var app = express.createServer();
app.configure(function(){
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({secret: cookieSecret}));
app.use(auth([
auth.Facebook({
appId : fbId,
appSecret: fbSecret,
callback: fbCallbackAddress,
scope: 'offline_access,email,user_about_me,user_activities,manage_pages,publish_stream',
failedUri: '/noauth'
})
]));
app.use(app.router);
});
app.get('/auth/facebook', function(req, res) {
req.authenticate("facebook", function(error, authenticated) {
if (authenticated) {
res.redirect("/great");
console.log("ok cool.");
console.log(res['req']['session']);
}
});
});
app.get('/noauth', function(req, res) {
console.log('Authentication Failed');
res.send('Authentication Failed');
});
app.get('/great', function( req, res) {
res.send('Supercoolstuff');
});
app.listen(8888);
Puis-je savoir ce qui ne va pas avec mon code?
javascript
node.js
express
DjangoRocks
la source
la source
Réponses:
L'
res
objet dans Express est une sous-classe de Node.jshttp.ServerResponse
( lire la source http.js ). Vous êtes autorisé à appelerres.setHeader(name, value)
aussi souvent que vous le souhaitez jusqu'à ce que vous appeliezres.writeHead(statusCode)
. AprèswriteHead
, les en-têtes sont intégrés et vous ne pouvez qu'appelerres.write(data)
, et enfinres.end(data)
.L'erreur "Erreur: impossible de définir les en-têtes après leur envoi". signifie que vous êtes déjà dans l'état Body ou Finished, mais une fonction a essayé de définir un en-tête ou un statusCode. Lorsque vous voyez cette erreur, essayez de rechercher tout ce qui tente d'envoyer un en-tête après qu'une partie du corps a déjà été écrite. Par exemple, recherchez les rappels qui sont appelés accidentellement deux fois ou toute erreur qui se produit après l'envoi du corps.
Dans votre cas, vous avez appelé
res.redirect()
, ce qui a provoqué la fin de la réponse. Ensuite, votre code a généré une erreur (res.req
estnull
). et puisque l'erreur s'est produite au sein de votre réelfunction(req, res, next)
(pas dans un rappel), Connect a pu l'attraper et a ensuite essayé d'envoyer une page d'erreur 500. Mais puisque les en-têtes ont déjà été envoyés, Node.js asetHeader
jeté l'erreur que vous avez vue.Liste complète des méthodes de réponse Node.js / Express et quand elles doivent être appelées:
La réponse doit être en tête et reste en tête :
res.writeContinue()
res.statusCode = 404
res.setHeader(name, value)
res.getHeader(name)
res.removeHeader(name)
res.header(key[, val])
(Express uniquement)res.charset = 'utf-8'
(Express uniquement; n'affecte que les méthodes spécifiques à Express)res.contentType(type)
(Express uniquement)La réponse doit être en tête et devient corps :
res.writeHead(statusCode, [reasonPhrase], [headers])
La réponse peut être dans la tête / le corps et reste dans le corps :
res.write(chunk, encoding='utf8')
La réponse peut être dans l'une ou l'autre tête / corps et devient terminée :
res.end([data], [encoding])
La réponse peut être dans l'une ou l'autre tête / corps et reste dans son état actuel:
res.addTrailers(headers)
La réponse doit être en tête et devient terminée :
return next([err])
(Connect / Express uniquement)function(req, res, next)
(Connect / Express uniquement)res.send(body|status[, headers|status[, status]])
(Express uniquement)res.attachment(filename)
(Express uniquement)res.sendfile(path[, options[, callback]])
(Express uniquement)res.json(obj[, headers|status[, status]])
(Express uniquement)res.redirect(url[, status])
(Express uniquement)res.cookie(name, val[, options])
(Express uniquement)res.clearCookie(name[, options])
(Express uniquement)res.render(view[, options[, fn]])
(Express uniquement)res.partial(view[, options])
(Express uniquement)la source
return
auparavantnext()
, merci cela m'a montré l'erreur!J'ai également rencontré cette erreur pendant un certain temps. Je pense (j'espère) que j'ai enroulé ma tête autour de lui, je voulais l'écrire ici pour référence.
Lorsque vous ajoutez un middleware pour vous connecter ou exprimer (qui est construit sur connect) à l'aide de la
app.use
méthode, vous ajoutez des éléments àServer.prototype.stack
in connect (au moins avec le courantnpm install connect
, qui est très différent de celui de github à ce jour). Lorsque le serveur reçoit une demande, il parcourt la pile en appelant la(request, response, next)
méthode.Le problème est, si dans l'un des éléments du middleware écrit dans le corps de la réponse ou les en-têtes (il semble que ce soit / ou pour une raison quelconque), mais n'appelle pas
response.end()
et vous appeleznext()
alors que laServer.prototype.handle
méthode principale se termine, il va remarquer cette:response.headerSent
vrai.Donc, il jette une erreur. Mais l'erreur qu'il génère n'est que cette réponse de base (à partir du
http.js
code source de connexion :Là, il appelle
res.setHeader('Content-Type', 'text/plain');
, que vous avez probablement défini dans votrerender
méthode, sans appeler response.end () , quelque chose comme:La façon dont tout doit être structuré est la suivante:
Bon middleware
Middleware problématique
Le middleware problématique définit l'en-tête de réponse sans appel
response.end()
ni appelnext()
, ce qui confond le serveur de connexion.la source
Certaines des réponses à cette Q&R sont fausses. La réponse acceptée n'est pas non plus très "pratique", donc je veux poster une réponse qui explique les choses en termes plus simples. Ma réponse couvrira 99% des erreurs que je vois publiées maintes et maintes fois. Pour les raisons réelles de l'erreur, jetez un œil à la réponse acceptée.
HTTP utilise un cycle qui nécessite une réponse par demande. Lorsque le client envoie une demande (par exemple POST ou GET), le serveur ne doit lui renvoyer qu'une seule réponse.
Ce message d'erreur:
se produit généralement lorsque vous envoyez plusieurs réponses pour une demande. Assurez-vous que les fonctions suivantes sont appelées une seule fois par demande:
res.json()
res.send()
res.redirect()
res.render()
(et quelques autres qui sont rarement utilisés, vérifiez la réponse acceptée)
Le rappel d'itinéraire ne reviendra pas lorsque ces fonctions res seront appelées. Il continuera à fonctionner jusqu'à ce qu'il atteigne la fin de la fonction ou une instruction de retour. Si vous souhaitez revenir lors de l' envoi d' une réponse , vous pouvez le faire comme si:
return res.send()
.Prenons par exemple ce code:
Lorsqu'une demande POST est envoyée à / api / route1, elle exécutera chaque ligne du rappel. Un message d'erreur Impossible de définir les en-têtes après leur envoi sera lancé car il
res.json()
est appelé deux fois, ce qui signifie que deux réponses sont envoyées.Une seule réponse peut être envoyée par demande!
L'erreur dans l'exemple de code ci-dessus était évidente. Un problème plus typique est lorsque vous avez plusieurs branches:
Cette route avec rappel associé trouve une entreprise dans une base de données. Lorsque vous effectuez une requête pour une entreprise qui n'existe pas, nous allons entrer dans la
else if
succursale et envoyer une réponse 404. Après cela, nous allons passer à la prochaine déclaration qui envoie également une réponse. Maintenant, nous avons envoyé deux réponses et le message d'erreur se produira. Nous pouvons corriger ce code en nous assurant de n'envoyer qu'une seule réponse:ou en revenant lors de l'envoi de la réponse:
Un gros pécheur est les fonctions asynchrones. Prenez la fonction de cette question, par exemple:
Ici, nous avons une fonction asynchrone (
findOneAndUpdate()
) dans l'exemple de code. S'il n'y a pas d'erreur, (err
)findOneAndUpdate()
sera appelé. Comme cette fonction est asynchrone,res.json(doc1)
elle sera appelée immédiatement. Supposons qu'il n'y ait aucune erreur dansfindOneAndUpdate()
. Leres.json(doc2)
dans leelse
sera alors appelé. Deux réponses ont maintenant été envoyées et le message d'erreur Can't set headers s'affiche.La solution, dans ce cas, serait de supprimer le fichier
res.json(doc1)
. Pour renvoyer les deux documents au client, leres.json()
dans l'autre peut être écrit commeres.json({ article: doc1, user: doc2 })
.la source
return
leres.json
res.send
boucle in for.J'ai eu ce même problème et j'ai réalisé que c'était parce que j'appelais
res.redirect
sansreturn
déclaration, donc lanext
fonction était également appelée immédiatement après:Ce qui aurait dû être:
la source
Beaucoup de gens ont rencontré cette erreur. C'est une confusion avec le traitement asynchrone. Très probablement, une partie de votre code définit des en-têtes dans le premier tick, puis vous exécutez un rappel asynchrone dans un tick futur. Entre les deux, l'en-tête de réponse est envoyé, mais d'autres en-têtes (comme une redirection 30X) essaient d'ajouter des en-têtes supplémentaires, mais il est trop tard car l'en-tête de réponse a déjà été transmis.
Je ne sais pas exactement ce qui cause votre erreur, mais considérez les rappels comme des domaines potentiels à étudier.
Une astuce simple pour simplifier votre code. Débarrassez-vous
app.configure()
et appelez simplementapp.use
directement dans votre portée de niveau supérieur.Voir aussi le module everyauth , qui fait Facebook et une douzaine d'autres fournisseurs d'authentification tiers.
la source
J'ai fait bouillir ma tête sur ce problème et cela s'est produit en raison d'une erreur imprudente dans la gestion des rappels. les rappels non retournés provoquent la définition de la réponse deux fois.!
Mon programme avait un code qui valide la demande et interroge la base de données. après avoir validé s'il y avait une erreur, je rappelais index.js avec les erreurs de validation. Et si la validation réussit, elle se poursuit et frappe la base de données avec succès / échec.
Ce qui se passait est le suivant: la validation Incase échoue, le rappel est appelé et la réponse est définie. Mais pas retourné. Il continue donc la méthode passe à db et a réussi / échoué. Il appelle à nouveau le même rappel, ce qui entraîne la définition de la réponse deux fois maintenant.
La solution est donc simple, vous devez «renvoyer» le rappel pour que la méthode ne continue pas à s'exécuter, une fois que l'erreur s'est produite et donc définir une fois l'objet de réponse
la source
callback(...)
sans unreturn;
après qui a finalement étéres.send(...)
appelé deux fois.Vous obtiendrez ce type d'erreur lorsque vous passerez des instructions après avoir envoyé une réponse.
Par exemple:
Cela entraînera l'erreur que vous voyez, car une fois la réponse envoyée, ce qui suit
res.send
ne sera pas exécuté.Si vous voulez faire quelque chose, vous devez le faire avant d'envoyer la réponse.
la source
Parfois, vous pouvez obtenir cette erreur lorsque vous essayez d'appeler la fonction next () après res.end ou res.send , essayez de supprimer si vous avez next () après res.send ou res.end dans votre fonction. Remarque: ici next () signifie qu'après avoir répondu au client avec votre réponse ( c'est-à-dire res.send ou res.end ), vous essayez toujours d'exécuter du code pour répondre à nouveau, ce n'est donc pas légal.
Exemple :
la source
Si vous utilisez des fonctions de rappel, utilisez
return
après leerr
bloc. Il s'agit de l'un des scénarios dans lesquels cette erreur peut se produire.Testé sur la version Node
v10.16.0
et express4.16.4
la source
Cette erreur se produit lorsque vous envoyez 2 réponses. Par exemple :
Imaginez si pour une raison quelconque les conditions A et B sont vraies,
render
vous obtiendrez cette erreur dans la secondela source
Dans mon cas, c'était une réponse 304 (mise en cache) qui causait le problème.
Solution la plus simple:
Solution alternative ici si vous voulez plus de contrôle:
http://vlasenko.org/2011/10/12/expressconnect-static-set-last-modified-to-now-to-avoid-304-not-modified/
la source
Dans mon cas, cela s'est produit avec React et postal.js lorsque je ne me suis pas désabonné d'une chaîne dans le
componentWillUnmount
rappel de mon composant React.la source
Pour tous ceux qui arrivent à cela et aucune des autres solutions n'a aidé, dans mon cas, cela s'est manifesté sur un itinéraire qui a géré le téléchargement d'images mais n'a pas géré les délais d'attente , et donc si le téléchargement a pris trop de temps et a expiré, lorsque le rappel a été déclenché après l'envoi de la réponse de délai d'attente , l'appel à res.send () a entraîné le blocage, car les en-têtes étaient déjà définis pour tenir compte du délai d'attente.
Cela a été facilement reproduit en définissant un délai très court et en frappant l'itinéraire avec une image assez grande, le crash a été reproduit à chaque fois.
la source
Je penchais juste ça. Vous pouvez transmettre les réponses via cette fonction:
la source
Ajoutez ce logiciel intermédiaire et cela fonctionnera
la source
Cela se produit lorsque la réponse a été remise au client et que vous essayez à nouveau de répondre. Vous devez vérifier dans votre code que, quelque part, vous renvoyez à nouveau la réponse au client, ce qui provoque cette erreur. Vérifiez et renvoyez la réponse une fois lorsque vous souhaitez revenir.
la source
J'ai eu ce problème lorsque je faisais des promesses de nidification. Une promesse à l'intérieur d'une promesse retournerait 200 au serveur, mais l'instruction catch de la promesse externe retournerait 500. Une fois que j'ai corrigé cela, le problème a disparu.
la source
Venu ici de nuxt , le problème était dans la
asyncData
méthode du composant , j'ai oublié dereturn
promettre qui récupérait les données et y mettait l'en-tête.la source
Veuillez vérifier si votre code renvoie plusieurs instructions res.send () pour une seule demande. Comme quand j'ai eu ce problème ...
J'étais ce problème dans mon application de nœud Restify. L'erreur était que
switch (status) { case -1: res.send(400); case 0: res.send(200); default: res.send(500); }
Je manipulais différents cas en utilisant switch sans interruption d'écriture. Pour ceux qui ne sont pas familiers avec les commutateurs, sachez que sans interruption, renvoyez des mots clés. Le code sous case et les lignes suivantes seront exécutés quoi qu'il arrive. Donc, même si je veux envoyer un seul res.send, en raison de cette erreur, il renvoyait plusieurs instructions res.send, ce qui a incité
switch (status) { case -1: res.send(400); break; case 0: res.send(200); break; default: res.send(500); break; }
la source
Il est très probable que ce soit plus un problème de nœud, 99% du temps, c'est un double rappel qui vous fait répondre deux fois, ou deux fois () suivant, etc., sacrément sûr. Il a résolu mon problème en utilisant next () dans une boucle. Supprimez le suivant () de la boucle ou arrêtez de l'appeler plus d'une fois.
la source
J'ai eu une erreur similaire lorsque j'ai essayé d'envoyer une réponse dans une fonction de boucle. La solution simple était de déplacer le
hors de la boucle car vous ne pouvez envoyer qu'une seule fois l'en-tête de réponse.
https://www.tutorialspoint.com/nodejs/nodejs_response_object.htm
la source
J'ajoute simplement le mot clé de retour comme:
return res.redirect("/great");
et walla!la source
J'ai eu le même problème causé par la mangouste.
pour corriger cela, vous devez activer
Promises
, afin que vous puissiez ajouter:mongoose.Promise = global.Promise
à votre code, ce qui permet d'utilisernative js promises
.d'autres alternatives à cette solution sont:
et
mais vous devez d'abord installer ces packages.
la source
erreur trouver par lui-même après un RND:
1) mon code d'erreur:
return res.sendStatus(200).json({ data: result });
2) mon code de réussite
return res.status(200).json({ data: result });
la différence est que j'ai utilisé sendStatus () au lieu de status () .
la source
Dans Typescript, mon problème était que je n'ai pas fermé la connexion Websocket après avoir reçu un message.
la source
Si vous ne recevez pas d'aide d'en haut: pour les noobs La raison de cette erreur est d'envoyer la demande plusieurs fois, comprenons dans certains cas: - 1. `
`dans le ci-dessus, appeler next () deux fois soulèvera une erreur
router.delete('/:orderId', (req, res, next) => { Order.remove({_id:req.params.orderId},(err,data)=>{ if(err){ **res.status(500).json(err);** }else{ res.status(200).json(data); } *res.status(200).json(data);* }) })
ici répondre est d'envoyer deux fois vérifier si vous avez déjà envoyé une réponse
la source
Dans mon cas, cela se produit en raison de multiples rappels. J'ai appelé la
next()
méthode plusieurs fois pendant le codela source
Mon problème était que j'avais un
setInterval
fonctionnement, qui avait unif/else
bloc, où laclearInterval
méthode était à l'intérieur duelse
:Mettre l'
clearInterval
avant avant aif/else
fait l'affaire.la source
Dans mon cas, dans une boucle, je mets
res.render()
donc aurait pu être tenté d'appeler plusieurs fois.la source
Tout ce que j'avais à faire en cas de cette erreur était res.end ().
L'autre problème que vous pourriez rencontrer est qu'il y a du code après res.json et res. écrire. Dans ce cas, vous devez utiliser return pour arrêter l'exécution après cela.
la source