Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can I execute code after "res.send"?

I'm wondering what the mechanics behind the behaviour of the following code are:

res.send(200, { data: 'test data' }); console.log('still here...'); 

My understanding is that res.send doesn't return the function, but does close the connection / end the request. This could explain why I can still execute code after a res.send command (I looked through the express source and it doesn't seem to be an asynchronous function).

Is there something else at play that I may be missing?

like image 353
Leonidas Avatar asked Apr 23 '13 22:04

Leonidas


People also ask

Does code execute after Res send?

req and res won't fire any more events, but the code in your callbacks is free to continue running (so long as it does not attempt to call methods on res that require a valid response to be open). this answer was very helpful and has convinced me to leave nodejs for ideological reasons.

What happens after Res send?

res. send() or res. json() should end all writing to the response stream and send the response. However, you absolutely can call next() if you want to do further processing after the response is sent, just make sure you don't write to the response stream after you call res.

Does Res send end the request?

res. send() is used to send the response to the client where res. end() is used to end the response you are sending.

What does Res send () do?

The res. send function sets the content type to text/Html which means that the client will now treat it as text. It then returns the response to the client.


2 Answers

Sure end ends the HTTP response, but it doesn't do anything special to your code.

You can continue doing other things even after you've ended a response.

What you can't do, however, is do anything useful with res. Since the response is over, you can't write more data to it.

res.send(...); res.write('more stuff'); // throws an error since res is now closed 

This behavior is unlike other traditional frameworks (PHP, ASP, etc) which allocate a thread to a HTTP request and terminate the thread when the response is over. If you call an equivalent function like ASP's Response.End, the thread terminates and your code stops running. In node, there is no thread to stop. req and res won't fire any more events, but the code in your callbacks is free to continue running (so long as it does not attempt to call methods on res that require a valid response to be open).

like image 79
josh3736 Avatar answered Sep 20 '22 16:09

josh3736


Edit: I no longer do what is explained below, as you shouldn't return a value when there is no need for it. It makes your code less readable and looks hackish. Instead, I suggest separating the return statement from the res.send(). @slavafomin explained this well in the comments.

A simple way to stop the execution of the function and send a response at the same time is by doing

return res.send('500', 'Error message here'); 

This allows you to use short if statements to handle errors such as:

if (err) {     return res.send('500', 'Error message here'); } 

The exact return of the res.send function is an object that seems to contain the entire state of the connection after you ended it (request, status, headers, etc.), but this should be unimportant since you won't be doing anything with it.

like image 22
Marcos Pereira Avatar answered Sep 18 '22 16:09

Marcos Pereira