This week I had to add caching to a specific HTTP endpoint. The endpoint is implemented in Express/Node.js, and unfortunately has caching semantics that mean a general purpose cache (i.e., Varnish) isn't appropriate. If I were still working in Django, I'd have either decorated the function, or written a piece of middleware to handle the caching. So my first exploration was in that direction.
I read the Express docs, and then I read the Express code. I'm not in love with NPM's dependency resolution model, but I do like that all of your dependencies are just in a sub-directory for easy perusal: no
dist-packages, virtualenv, etc to explain.
I learned that to do the sort of wrapping that's so natural in Django with Express middleware meant overwriting a bunch of methods on
response to catch the output as it streams by. If you just override
end, you're probably too late.
For an example, check out the compress middleware. It makes for some difficult reading.
I'm more aware today that there are layers to learning: there are facts, and there are implications. I knew the fact that Express was good for streaming responses, but hadn't considered what the implications of that were on how I'd write collaborating code.