DEV Community

Peter Eysermans
Peter Eysermans

Posted on • Originally published at eysermans.com

Installing a node.js application as a Windows service

It wasn't my intention when I started the first article but this has become a series of how to run node applications in production with IIS on Windows. These are the previous articles on the topic:

In the last article a node web application was deployed on a Windows server. With the help of the HTTP platform handler, IIS manages the node process for us. When it receives a request it will start the node process and pass the web request for node to handle it.

In some cases however we don't want to expose the node.js web application via IIS. I have built an internal API in the past which should not be accessible from the outside for security reasons. The internal API is only consumed by other applications running on the same server. In this case, we can't rely on IIS to manage the node process for us as IIS would expose the web application to the internet.

We need an alternative to keep the node process running to make the internal API available on the server via localhost. PM2 can manage the node process and keep it up and running. Unfortunately I did not find a reliable way to start PM2 whenever the Windows Server restarts. Every time the server restarted, the internal API was down and had to be manually started.

Luckily there is a NPM package node-windows which can install a node application as a Windows service. This service can be automatically started when the server restarts.

This is the Hello World sample from the Express website, we will install it as a Windows service:

const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => res.send('Hello World!'))

app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`))
Enter fullscreen mode Exit fullscreen mode

The node-windows NPM package can do this for us. Run the following commands

npm install -g node-windows
npm link node-windows
Enter fullscreen mode Exit fullscreen mode

Once the package is installed it can be used to install the application as a service with the following node script:

var Service = require('node-windows').Service;

// Create a new service object
var svc = new Service({
  name:'Node application as Windows Service',
  description: 'Node application as Windows Service',
  script: 'C:\\temp\\test.js'
});

// Listen for the "install" event, which indicates the
// process is available as a service.
svc.on('install',function(){
  svc.start();
});

svc.install();
Enter fullscreen mode Exit fullscreen mode

Just run the script as any other node script:

node install-windows-service.js
Enter fullscreen mode Exit fullscreen mode

If User Account Control (UAC) is enabled on Windows you will have to give permission a few times to complete the installation. Once this script has finished the service is installed and the application is running. You can find the service in the Services dialog. It will have the name that you have passed to the Service class in the node script.

Services dialog with the newly installed Windows service

If the service ever needs to be uninstalled, the Service class also has an uninstall method:

var Service = require('node-windows').Service;

// Create a new service object
var svc = new Service({
  name:'Node application as Windows Service',
  description: 'Node application as Windows Service',
  script: 'C:\\temp\\test.js'
});

// Listen for the "uninstall" event so we know when it's done.
svc.on('uninstall',function(){
  console.log('Uninstall complete.');
  console.log('The service exists: ',svc.exists);
});

// Uninstall the service.
svc.uninstall();
Enter fullscreen mode Exit fullscreen mode

This can also be run as any other node script:

node uninstall-windows.service.js
Enter fullscreen mode Exit fullscreen mode

Because the Windows service is set to start automatic, it will start every time the server is restarted. Exactly as expected. Happy deploying!

This is a cross post from my own blog.

Top comments (2)

Collapse
 
denisehilton profile image
Denise Hilton

I believe the easiest way to run a nodejs app as a Windows service is by using nssm to create the service. Just a couple of commands and you're done. Here's a short version of the guide.

Collapse
 
petereysermans profile image
Peter Eysermans

I agree, I have used NSSM in the past and it's also very useful. Thanks for the guide!