Welcome to the Linux Foundation Forum!

What will happen if some value returned from 'request' event handler?

Options

Hi, I have a question in Mock Services (1), I noticed that the mock service used several return void res.end().
void res.end() will discard the return value of res.end() which is res itself. Then it will replace it with undefined.

As far as I observed, the purpose is to interrupt the process of the handler function of 'request' event. So my question is: what will happen if the handler function returns some value other than undefined?

Best regards.

Answers

  • xdxmxc
    xdxmxc Posts: 148
    edited December 2022
    Options

    hey @krave good question, thanks for asking it I was hoping to be asked one day, it's sort of like you've found the easter egg :D 🥚.

    So here's what it is, if you're writing a barebones http server you're going for something quick and cheap or you're going for performance engineering and return void res.end() caters to both of those things. Generally speaking JavaScript makes the developers life easier. At least in the sense that it is low-ceremony, low friction (importantly: at low scale). In limited scenarios where performance is considered a (genuine) business priority I use a different set of habitual coding practices. In the course material performance isn't stated as a priority, because it isn't but I left it there as a breadcrumb for discussion on this topic.

    One of the typical underlying JS engine optimizations revolves around object shapes, as in what properties does it have, what are the types (primitives or nested object shapes - which, in the engine layer are kind of the same) and so on. If the object-shapes (or primitives) that you pass to a function AND the shapes/prims you return from a function are consistently the same then you have a monomorphic function. JS engines can optimize monomorphic functions because they have reliable "types". One you return a different shape, or input a different shape into the function, now it's polymorphic. JS engines can optimize for that as well, up to a limit, there's only so many different shapes you can input/return from a JS function before it becomes megamorphic. Last I checked it was 4 (in V8), but it could change and be different in different JS engines. Megamorphic will be the slowest executing.

    Ok so why return void res.end() it's just short hand for:

    res.end()
    return
    

    The only point being made is to consistently return the same type. BUT return void res.end() sticks out and that is on purpose, it make it obvious that this function should always return undefined. Whereas the conventional way, is more familiar and implicit. To reiterate, this is not a practice I'd recommend for general usage. It's part of a different rule set.

    So, there is NO PROGRAMATIC EFFECT to returning something else from the listener function, it doesn't do anything with the return value. However, if you're in a position where you're setting out to use practices that mitigate the death-by-a-thousand-cuts style dispersed bottleneck problems ahead of time then it's important to consider there IS A PERFORMANCE EFFECT.

    It's a little dated now but the general concepts still apply: I wrote a post about JS performance, this links straight to the section on polymorphism:

    https://medium.com/the-node-js-collection/get-ready-a-new-v8-is-coming-node-js-performance-is-changing-46a63d6da4de#93df

    Appreciate the question @krave ✌️

Categories

Upcoming Training