Understanding Express Middleware in Node.js

Middleware is one of those interesting concepts that once you get it is very, very helpful. I learned this from making the autominify middleware for express.

The concept goes like this:
Express is initialized. Each time you add an app.use call, it appends it to a list of things to try every time someone requests a file. When a file is requested, each of these is called in turn and, if they don’t care about the request, they call a next() function and Express moves onto the next app.use call. If nothing claims the request, a 404 is called.

The syntax is pretty simple, but there’s some useful things I’ve done in autominify that you might want to use, as well.

This is the simplesty example of this I could think of. An inline function only executes if “helloworld” is somewhere in your url. This could be as simple as
http://localhost:3000?helloworld=true
and it would produce “helloworld” as the page.
If you didn’t have helloworld in your url, it would process as normal.

app.use(function(req, res, next){
	if(req.url.indexOf('helloworld') != -1){
		res.writeHead(200, {'Content-Type': 'text/plain'});
		res.end('helloworld');
	}
	else
	{
		next();
	}
});

Remember that app.use executes in order, so if something else handles the request before you do, you’ll never see your code work.

If you’re looking to make a module, here’s the basics you might need.

//in app.js
var myModule = require('myModule');
app.use(myModule(true));
//file called myModule.js
module.exports = function (goodbye) {
	var mainText = "hello world";
	if(goodbye)
	{
		mainText = "goodbye world"
	}
 
	return function (req, res, next) {
		if(req.url.indexOf('helloworld') != -1){
			res.writeHead(200, {'Content-Type': 'text/plain'});
			res.end(mainText);
		}
		else
		{
			next();
		}
	}
}

You’ve passed in true as an init param. This would mean that all sessions that are handled with this middleware (any request with helloworld in the url) would receive “goodbye world” as the text on the page.

Leave a Reply

Your email address will not be published. Required fields are marked *