How to start Node.js app windowless in Windows

Node.js is getting more popular by the day. It breaks JavaScript free from the browser. I would love to auto start an application - much like a Windows service - without keeping a console window open. There are many programs / services to wrap node applications into an executable, but I like to stick with just Node. This small trick will start your Node application windowless on Windows.

VBS to the rescue

I've created a small Visual Basic Script called app.vbs that will start your node application within a hidden window:

CreateObject("Wscript.Shell").Run "node app.js", 0

The little zero at the end does the trick. The string is the command to start the node process with the app.js. The .vbs extension is executable in Windows.

Autostart

To execute it automatically at startup, open the %AppData%\Microsoft\Windows\Start Menu\Programs\Startup\ directory and add a shortcut to the app.vbs file.

Proof of concept

So let's build a small app to proof that it works. The following script will create a web server and log all the requests to a debug file. We'll stream the file back. The /clear will clear the log file. The /kill will stop the app - this is very important, because the app will be started without a window. This will give us an easy way to shut it down.

var app = require('express')();
var fs = require('fs');
var util = require('util');
var logFileName = __dirname + '/debug.log';

//log number of requests
var nrOfRequests = 0;

//capture all requests
app.get('*', (req, res) => {

    nrOfRequests++;
    console.log(`${nrOfRequests}. [${req.url}] on ${new Date()}`);

    res.sendFile(logFileName, () => {
        if (req.url == '/kill')
            setTimeout(() => process.exit(), 500);
        else if (req.url == '/clear') {
            fs.createWriteStream(logFileName, { flags: 'w' })
        }
    });
});

//log to file
var logFile = fs.createWriteStream(logFileName, { flags: 'a' });
var logProxy = console.log;
console.log = function (d) { //
    logFile.write(util.format(d || '') + '\n');
    logProxy.apply(this, arguments);
};

//start listening
var port = process.env.PORT || 5000;
app.listen(port, function () {
    console.log('Application started on ' + new Date());
    console.log("Listening on " + port);
});

Try it out!

Don't forget to execute a npm install express to install the web server! Always make sure that the node app.js works. The .vbs will not create a window, so you won't see if it crashes.

  1. Execute the app.vbs. This will create a process:
    Node.exe is now visible in the Task Manager
  2. Open up the app in your browser http://localhost:5000 and you'll see:
    The server streams the debug logging back.
  3. Play around with it and kill the application with http://localhost:5000/kill. This request stops the node application. You'll see that it is no longer present in the task manager.

Wrap-up

So, that's it. Pretty easy. Remember: this only works under Windows! Also remember: windowless applications can't be terminated using the CTRL+C command. Killing the process in the task manager will.

  1. montjoile says:

    thanks a lot! It was helpful

  2. grabantot says:

    Check out runbg module on npm (https://www.npmjs.com/package/runbg). It uses similar approach and prints out PID of the started process.

  3. grabantot says:

    Check out runbg module on npm https://www.npmjs.com/package/runbg . It uses similar approach and prints out PID of the started process.

  4. Reg says:

    Awesome , that was very helpful thanks

  5. MoolsBytheway says:

    You just saved my life, i love you

  6. Fred says:

    Thank you so much! This helped tremendously, yet it was such a simple solution!!!!!!!!!!!! Thanks again!

  7. Artur Mustafin says:

    Also, it works on windows CMD and Python scripts.
    I have created app.cmd and app.vbs in the same direcory with python scripts.

    app.vbs executing app.cmd:

    CreateObject("Wscript.Shell").Run "app.cmd " & WScript.Arguments(0), 0

    app.cmd executing python script name as an argument:

    setlocal
    set PATH=C:msys64mingw64bin;%PATH%
    python3w %~dp0%1
    endlocal
    exit

    executing Run command:

    "C:workpythonguigkrakenapp.vbs" "run"

    Great phanks to the author!

    P.S.:

    exit command seems not needed, but can be useful if you are using CMD file

expand_less