February 21, 2018

One of the most annoying programming mistakes I face on a regular basis is when people use boolean, where they should use enum instead. The rule is simple: if two possible values is just coincidence, it must be enum.

Might be not the best example, but GET /thumbnail?size=large instead of GET /thumbnail?isLarge=true Or public gender: Gender instead of public isMale: boolean

January 23, 2013

Recursive remove directory for Node.js

It turned out that Node.js fs module does not have a method to remove the directory and its content recursively. Instead you should go through the directory structure and remove atomic items, i.e. individual files and empty directories. So I found a nice gist by Takuo Kihira at https://gist.github.com/2367067 made in JavaScript and decided to make a CoffeeScript version of it:

But in real life you should better use the system command:

child_process.exec "rm -rf #{directory}"

This might be much faster at the cost of platform dependency.

October 22, 2012

Deploy multiple Node applications on one web server in subdomains with Nginx

Earlier I wrote about deploying multiple Node applications on one web server in subfolders with Nginx.

Even though this approach is fully viable, you should not use it unless there are some really important reasons forcing you to go for it.

Given that the application is mounted to a subfolder, you should use relative URLs only in pages. Otherwise the application location must be configured in both Nginx and application itself. Use of relative URLs has a couple of major drawbacks:

  • If you want to move a page within hierarchy, you need to update its content. For example, you have a page that makes an AJAX call to ../getValue. Once you move your page one level up or down in the hierarchy, it does not work.
  • You need to solve a "trailing slash problem". For example, the page http://myhost/demo/pet-project/user-list must be also resolvable as http://myhost/demo/pet-project/user-list/. But if it refers a CSS file as ../css/user-list.css, the server will look for it at /opt/demo/pet-project/public/css/user-list.css and /opt/demo/pet-project/public/user-list/css/user-list.css correspondingly. It can be fixed by introducing the concept of canonical URLs and redirecting the client to the "proper" URL with or without trailing slash, depending on the chosen convention.

To minimize the maintenance complexity and avoid performance downgrade I decided to deploy Node applications in subdomains. With this approach I can freely use absolute URLs and thus easily shuffle my pages and have valid references without annoying redirects.

Nginx configuration for this setup is very similar to the one with subfolders and even a little bit more simple:

Finally you need to configure a DNS record for pet-project.myhost pointing to your server.

September 18, 2012

JSON format command line utility

Very often I need to format a single-line JSON, so I can read it easily.

Even though modern browser developer tools do it nicely with server responses in preview tab, I want to be able to do something similar with local files.

Node.js has a very good API to work both with JSON and file system. So I created this simple command line utility in CoffeeScript. It accepts the input file name as a 1st parameter and the output file as an optional 2nd parameter. If the output file name is undefined, it writes the result to the console.

July 12, 2012

Deploy multiple Node applications on one web server in subfolders with Nginx

Things get tricky with Node when you need to move your application from from localhost to the internet.

There is no common approach for Node deployment.

Google can find tons of articles on this topic, but I was struggling to find the proper solution for the setup I need.

Basically, I have a web server and I want Node applications to be mounted to subfolders (i.e. http://myhost/demo/pet-project/) without introducing any configuration dependency to the application code.

At the same time I want other stuff like blog to run on the same web server.

Sounds simple huh? Apparently not.

In many examples on the web Node applications either run on port 80 or proxied by Nginx to the root.

Even though both approaches are valid for certain use cases, they do not meet my simple yet a little bit exotic criteria.

That is why I created my own Nginx configuration and here is an extract:

From this example you can notice that I mount my Pet Project Node application running on port 3000 to http://myhost/demo/pet-project.

First Nginx checks if whether the requested resource is a static file available at /opt/demo/pet-project/public/ and if so it serves it as is that is highly efficient, so we do not need to have a redundant layer like Connect static middleware.

Then all other requests are overwritten and proxied to Pet Project Node application, so the Node application does not need to know where it is actually mounted and thus can be moved anywhere purely by configuration.

proxy_redirect is a must to handle Location header properly. This is extremely important if you use res.redirect() in your Node application.

You can easily replicate this setup for multiple Node applications running on different ports and add more location handlers for other purposes.

UPDATE: Why and how you should do it in subdomains instead.