Building Native Node.js Add-ons on z/OS

Building Native Node.js Add-ons on z/OS

Here I will show how you can build a native C++ addon for Node.js on z/OS.

Warning! It is not easy but it works.

IBM has ported Node.js to z/OS so you can run Node.js server applications on z/OS. You can download it from the IBM website: IBM SDK for Node.js — z/OS — Overview.

We see how to install it together with the provided C/C++ compiler so you will be able to build native extensions with node-gyp. We will start by building a “Hello World” native addon on Mac and then building the same extension on z/OS.

The latest ported version of Node.js on z/OS is 6.17.0. We will use the latest version on macOS. The native addon code is the same on both platforms.

Why you should be interested in Node.js? Some of the reasons are mention in Why you would you want to run it on z/OS? z/OS delivers a secure, scalable, available infrastructure for on-premises. If a lot of your data resides on z/OS, the performance of your Node.js applications will benefit from it.

When do you need to write a native add-on for Node.js on z/OS? There are two main reasons. First one is to optimize the performance sensitive code such as CPU intensive calculations. Second, is to interoperate with a native mainframe application that you have on z/OS.

Building native Node.js addon on macOS

Let’s start with a platform that is used by many developers. You can skip this section if you are already familiar with this process on macOS, Linux, or Windows.

We will build an example addon from

This example used nan — C++-based abstraction between Node and direct V8 APIs. It is very simple and it prints just:


We need to get the source code first:

git clone

Then change directory to the example:

cd node-addon-examples/1_hello_world/nan/

If you do not have Node.js yet installed, you can use Homebrew to install it:

brew install node

You need to have a C++ compiler on your system. You need to install the Command Line Tools via Xcode:

xcode-select --install

Next step is to compile the native addon:

npm install

You should get a similar output to this:

> [email protected] install /Users/petrplavjanik/workspace/node-addon-examples/1_hello_world/nan
> node-gyp rebuild
CXX(target) Release/
  SOLINK_MODULE(target) Release/hello.node
audited 2 packages in 3.677s
found 0 vulnerabilities

You are ready to issue node hello.js and get world.

Before we will be able to do the same thing on z/OS, we need to install Node.js on z/OS with all prerequisites.

Installing Node.js on z/OS

You need to have all the prerequisites listed at

  • z/OS V2R2 with PTF UI46658, z/OS V2R3, or higher
  • Integrated Cryptographic Services Facility (ICSF) must be enabled on systems where SDK for Node.js is run
  • Python 2.7.13 or higher that is provided by Rocket Software. Note that Python 3.x is not compatible with node-gyp that is used for building native add-ons
  • GNU Make 4.1 or higher that is provided by Rocket Software
  • Bash 4.3 or higher that is provided by Rocket Software and is required to install Python 2.7
  • Gzip 1.9 or higher that is provided by Rocket Software and is required to unpackage other software provided by Rocket Software

The Rocket Software open-source downloads are available at

If you are using the z/OS trial version of Node.js from instead of the SMP/E installed version then you need Perl 5.24.0 or higher that is provided by Rocket Software as well.

Since there is a lot of steps to do and they are described in multiple guides on different places, we will cover all of them here.

We will use Zowe CLI to simplify the interaction with z/OS. You can install Zowe CLI by following the instructions on including setting up the z/OSMF profile. If you do not have Zowe CLI or z/OSMF then you can do all steps manually.

Downloading Rocket Software open-source

We will download all the archives first before installing them. Download all of them to the same directory.

  1. Go to
  2. Log in or sign up to the Rocket Community
  3. Search for make and download make-4.1_b0002.160426.tar.gz
  4. Search for python and download python-2017–04–12-py27.tar.gz
  5. Search for perl and download perl-5.24.0_b007.180202.tar.gz
  6. Search for bash and download bash-4.3_b018.170518.tar.gz
  7. Search for gzip and download gzip-1.9-edc_b002.180703.tar

Create zFS Filesystem for Rocket Software open-source and Node.js

You will need about 4 GB of space. It is recommended to allocate new zFS filesystem for it. You can use the following job template and replace ${jobcard} and ${prefix} variables with your job card and the prefix for the data sets with the zFS file system.

TRACKS(80000 80000) -
// PARM=('format -aggregate ${prefix}.ZFS')

JCL that creates a zFS filesystem on z/OS

You can submit this JCL easily using Zowe CLI:

curl -O

Edit the file in your favorite text editor and replace the variables. Then you can submit it:

zowe zos-jobs submit local-file create_zfs.jcl

Give Zowe CLI a try! It allows you to interact with z/OS jobs, data sets, z/OS UNIX files and much more from your workstation:

Submitting a job via Zowe CLI

Recorded by

After the job completes, you need to mount the filesystem. Login to your z/OS system via ssh or Putty. Issue following command (you need to replace ${rocket_home} and ${prefix} variables):

export ROCKET_HOME=${rocket_home}
mkdir ${ROCKET_HOME}
/usr/sbin/mount -f ${prefix}.ZFS ${ROCKET_HOME}
mkdir download

Now, you need to get back to your workstation terminal and copy the packages to zFS:

zowe zos-files upload file-to-uss --binary gzip-1.9-edc_b002.180703.tar ${ROCKET_HOME}/download/gzip-1.9-edc_b002.180703.tar
zowe zos-files upload file-to-uss --binary perl-5.24.0_b007.180202.tar.gz ${ROCKET_HOME}/download/perl-5.24.0_b007.180202.tar.gz
zowe zos-files upload file-to-uss --binary python-2017-04-12-py27.tar.gz ${ROCKET_HOME}/download/python-2017-04-12-py27.tar.gz
zowe zos-files upload file-to-uss --binary make-4.1_b0002.160426.tar.gz ${ROCKET_HOME}/download/make-4.1_b0002.160426.tar.gz

Go back to the z/OS shell session and unpack these packages:

tar -C ${ROCKET_HOME} -xovf ${ROCKET_HOME}/download/gzip-1.9-edc_b002.180703.tar
${ROCKET_HOME}/bin/gunzip --stdout {ROCKET_HOME}/download/perl-5.24.0_b007.180202.tar.gz | tar xoUXf -
${ROCKET_HOME}/bin/gunzip --stdout ${ROCKET_HOME}/download/python-2017-04-12-py27.tar.gz | tar xoUXf -
${ROCKET_HOME}/bin/gunzip --stdout ${ROCKET_HOME}/download/bash-4.3_b018.170518.tar.gz | tar xoUXf -
${ROCKET_HOME}/bin/gunzip --stdout ${ROCKET_HOME}/download/make-4.1_b0002.160426.tar.gz | tar xoUXf -
${ROCKET_HOME}/bin/gunzip --stdout ${ROCKET_HOME}/download/python-2017-04-12-py27.tar.gz | tar xoUXf -

Now is the time to assign correct access rights:

chmod -R 755 ${ROCKET_HOME}/bin/*
find ${ROCKET_HOME}/lib -type f -exec chmod 644 {} \\;
find ${ROCKET_HOME}/lib -type f -name '*.so' -exec chmod 755 {} \\;

We need to set the environment variables before these tools can be read. They require auto conversion to be on.

These are the recommended settings:

Recommended .profile settings

# Runtime options require by Rocket open-source:
export _TAG_REDIR_ERR=txt
export _TAG_REDIR_IN=txt
export _TAG_REDIR_OUT=txt
export ROCKET_HOME=${rocket_home}
# Perl:
export PERL5LIB=$ROCKET_HOME/lib/perl5:$PERL5LIB
export LIBPATH=$ROCKET_HOME/lib/perl5/5.24.0/os390/CORE:$LIBPATH
# Python 2.7:
export PY_RELEASE_NAME=python-2017-04-12
export PY_RELEASE_TYPE=py27
export PYTHON_ENV=python27
export FFI_LIB=$PYTHON_HOME/lib/ffi
export TERMINFO=$PYTHON_HOME/share/terminfo
export PKG_CONFIG_PATH=$PYTHON_HOME/lib/pkgconfig:$PYTHON_HOME/share/pkgconfig
export CURL_CA_BUNDLE=$PYTHON_HOME/etc/ssl/cacert.pem
# Rocket Ported Tools:

You need to put them to a directory in zFS:

curl -O
# edit and replace ${rocket_home}
zowe zos-files upload file-to-uss ${rocket_home}/

Then you can make it active in the z/OS shell by:


You can put this line to your ~/.profile if you want to have it activate for each session.

The last step is to complete the installation of Python:

export RELEASE_NAME=python-2017-04-12
export RELEASE_TYPE=py27
export PKGS_BASE=${RELEASE_DIR}/pkgs
cd ${PY_RELEASE_DIR}/python27; bin/install_all_packages

If everything is fine, delete the packages:

rm -Rf download

Download and install Node.js for z/OS

Now we are ready to install Node.js for z/OS. Download the PAX file from

Upload the PAX file ibm- to zFS.

zowe zos-files upload file-to-uss --binary ibm- ${rocket_home}/ibm-

In the z/OS shell:

pax -rf ibm- -x pax

Node.js installed to run applications but we need to make the Node.js SDK C/C++ compiler working. This can be done by script but that script needs manual updates in order to be working properly.

You can download it from the following link:

curl >
zowe zos-files upload file-to-uss ${rocket_home}/node-v6.17.0-os390-s390x/

On z/OS:

cd ${ROCKET_HOME}/node-v6.17.0-os390-s390x
ln -s bin/njsc++ bin/g++
chmod a+x *.pl

For example:


This will take a while and in the end, you should see the following message:

Hello C++ World!
<INFO> installation complete!

If you do not see the message, check two jobs that were submitted by this script.The C/C++ environment comes pre-configured when using npm to build native add-ons. However, if you invoke node-gyp directly to build native code, the following C/C++ compiler environment variables need to be set:

export _C89_CCMODE=1
export _CC_CCMODE=1
export _CXX_CCMODE=1

You should add the following lines to the activation shell script

# Node.js:
export NODE_HOME=${ROCKET_HOME}/node-${NODE_VERSION}-os390-s390x
export PATH=${NODE_HOME}/bin:$PATH
export _C89_CCMODE=1
export _CC_CCMODE=1
export _CXX_CCMODE=1

And activate it:

mkdir -p 1_hello_world/nan

Verify that is working by issuing node --version which should return v6.17.0.

Building the native add-on on z/OS

Go to the directory with the sample add-on on your workstation:

cd node-addon-examples/1_hello_world/nan/

Copy the source files to the z/OS:

zowe zos-files upload file-to-uss binding.gyp ${rocket_home}/1_hello_world/nan/binding.gyp
zowe zos-files upload file-to-uss ${rocket_home}/1_hello_world/nan/
zowe zos-files upload file-to-uss hello.js ${rocket_home}/1_hello_world/nan/hello.js
zowe zos-files upload file-to-uss package.json ${rocket_home}/1_hello_world/nan/package.json

We are ready to build it on z/OS:

cd ${ROCKET_HOME}/1_hello_world/nan
npm install --nodedir=${NODE_HOME}

The option --nodedir=${NODE_HOME} is important because it makes node-gyp to use C++ headers from Node.js on z/OS instead of downloading not-z/OS version from the internet.

Then you can issue node hello.js.

The output should be world!

In the future, we will work with VSAM datasets from Node.js application and we will create simple API service on z/OS that reads and stores data in a VSAM dataset vsam.js and Express. My mate Dan Kelosky will show you how to use NestJS with TypeScript on z/OS.

You are ready to take advantages of the Node.js and npm ecosystem: 😊


Thanks for reading ❤

If you liked this post, share it with all of your programming buddies!

Follow me on Facebook | Twitter

Learn More

The Complete Node.js Developer Course (3rd Edition)

Angular & NodeJS - The MEAN Stack Guide

NodeJS - The Complete Guide (incl. MVC, REST APIs, GraphQL)

Node.js: The Complete Guide to Build RESTful APIs (2018)

Learn and Understand NodeJS

MERN Stack Front To Back: Full Stack React, Redux & Node.js

Learn Node.js - Node.js API Development for Beginners

Moving from NodeJS to Go

How to Perform Web-Scraping using Node.js

Node.js, ExpressJs, MongoDB and Vue.js (MEVN Stack) Application Tutorial

Top 10 Node.js Frameworks

Top 7 Most Popular Node.js Frameworks You Should Know

Top 7 Most Popular Node.js Frameworks You Should Know

Node.js is an open-source, cross-platform, runtime environment that allows developers to run JavaScript outside of a browser. In this post, you'll see top 7 of the most popular Node frameworks at this point in time (ranked from high to low by GitHub stars).

Node.js is an open-source, cross-platform, runtime environment that allows developers to run JavaScript outside of a browser.

One of the main advantages of Node is that it enables developers to use JavaScript on both the front-end and the back-end of an application. This not only makes the source code of any app cleaner and more consistent, but it significantly speeds up app development too, as developers only need to use one language.

Node is fast, scalable, and easy to get started with. Its default package manager is npm, which means it also sports the largest ecosystem of open-source libraries. Node is used by companies such as NASA, Uber, Netflix, and Walmart.

But Node doesn't come alone. It comes with a plethora of frameworks. A Node framework can be pictured as the external scaffolding that you can build your app in. These frameworks are built on top of Node and extend the technology's functionality, mostly by making apps easier to prototype and develop, while also making them faster and more scalable.

Below are 7of the most popular Node frameworks at this point in time (ranked from high to low by GitHub stars).


With over 43,000 GitHub stars, Express is the most popular Node framework. It brands itself as a fast, unopinionated, and minimalist framework. Express acts as middleware: it helps set up and configure routes to send and receive requests between the front-end and the database of an app.

Express provides lightweight, powerful tools for HTTP servers. It's a great framework for single-page apps, websites, hybrids, or public HTTP APIs. It supports over fourteen different template engines, so developers aren't forced into any specific ORM.


Meteor is a full-stack JavaScript platform. It allows developers to build real-time web apps, i.e. apps where code changes are pushed to all browsers and devices in real-time. Additionally, servers send data over the wire, instead of HTML. The client renders the data.

The project has over 41,000 GitHub stars and is built to power large projects. Meteor is used by companies such as Mazda, Honeywell, Qualcomm, and IKEA. It has excellent documentation and a strong community behind it.


Koa is built by the same team that built Express. It uses ES6 methods that allow developers to work without callbacks. Developers also have more control over error-handling. Koa has no middleware within its core, which means that developers have more control over configuration, but which means that traditional Node middleware (e.g. req, res, next) won't work with Koa.

Koa already has over 26,000 GitHub stars. The Express developers built Koa because they wanted a lighter framework that was more expressive and more robust than Express. You can find out more about the differences between Koa and Express here.


Sails is a real-time, MVC framework for Node that's built on Express. It supports auto-generated REST APIs and comes with an easy WebSocket integration.

The project has over 20,000 stars on GitHub and is compatible with almost all databases (MySQL, MongoDB, PostgreSQL, Redis). It's also compatible with most front-end technologies (Angular, iOS, Android, React, and even Windows Phone).


Nest has over 15,000 GitHub stars. It uses progressive JavaScript and is built with TypeScript, which means it comes with strong typing. It combines elements of object-oriented programming, functional programming, and functional reactive programming.

Nest is packaged in such a way it serves as a complete development kit for writing enterprise-level apps. The framework uses Express, but is compatible with a wide range of other libraries.


LoopBack is a framework that allows developers to quickly create REST APIs. It has an easy-to-use CLI wizard and allows developers to create models either on their schema or dynamically. It also has a built-in API explorer.

LoopBack has over 12,000 GitHub stars and is used by companies such as GoDaddy, Symantec, and the Bank of America. It's compatible with many REST services and a wide variety of databases (MongoDB, Oracle, MySQL, PostgreSQL).


Similar to Express, hapi serves data by intermediating between server-side and client-side. As such, it's can serve as a substitute for Express. Hapi allows developers to focus on writing reusable app logic in a modular and prescriptive fashion.

The project has over 11,000 GitHub stars. It has built-in support for input validation, caching, authentication, and more. Hapi was originally developed to handle all of Walmart's mobile traffic during Black Friday.

Node.js Tutorial for Beginners | Node.js Crash Course | Node.js Certification Training

This courseis designed for professionals who aspire to be application developers and gain expertise in building real-time, highly-scalable applications in Node.js. The following professionals can go for this course :

Why learn Node.js?

Node.js uses JavaScript - a language known to millions of developers worldwide - thus giving it a much lower learning curve even for complete beginners. Using Node.js you can build simple Command Line programs or complex enterprise level web applications with equal ease. Node.js is an event-driven, server-side, asynchronous development platform with lightning speed execution. Node.js helps you to code the most complex functionalities in just a few lines of code...

Thanks for reading :heart: If you liked this post, share it with all of your programming buddies! Follow me on Facebook | Twitter

Learn More

The Complete Node.js Developer Course (3rd Edition)

Angular & NodeJS - The MEAN Stack Guide

NodeJS - The Complete Guide (incl. MVC, REST APIs, GraphQL)

Docker for Node.js Projects From a Docker Captain

Intro To MySQL With Node.js - Learn To Use MySQL with Node!

Node.js Absolute Beginners Guide - Learn Node From Scratch

React Node FullStack - Social Network from Scratch to Deploy

Selenium WebDriver - JavaScript nodeJS webdriver IO & more!

Complete Next.js with React & Node - Beautiful Portfolio App

Build a Blockchain & Cryptocurrency | Full-Stack Edition

A Beginner Guide To Node.js (Basic Introduction To Node.js)

Node.js is a very popular javascript free and open source cross-platform for server-side programming built on Google Chrome’s Javascript V8 Engine. It is used by thousands of developers around the world to develop mobile and web applications. According to StackOverflow survey, Node.js is one of most famous choice for building the web application in 2018.


Node.js is a very popular javascript free and open source cross-platform for server-side programming built on Google Chrome’s Javascript V8 Engine. It is used by thousands of developers around the world to develop mobile and web applications. According to StackOverflow survey, Node.js is one of most famous choice for building the web application in 2018.

In this article, you will gain a deep understanding of node, learn how node.js works and why it is so popular among the developers and startups. Not In startup even big companies like eBay, Microsoft, GoDaddy, Paypal etc.

Why is Node.js so much popular

It is fast very fast

It’s a javascript runtime built on google chrome javascript v8 engine which means both node js and js executed in your browser running in the same engine that makes it very fast in comparison to any other server-side programming language.

It uses event-driven and non-blocking model

Node.js uses the event-driven, non-blocking I/O model that makes it very lightweight and efficient.
Now let’s understand the above statement in more details. Here I/O refers to Input /Output.

Event Driven Programming is a paradigm in which control flow of any program is determined by the occurrence of the events. All these events monitor by the code which is known as an event listener. If you are from javascript background then most probably you know what is event-listeners. In short, event-listener is a procedure or function that waits for an event to occurs. In javascript, onload, onclick, onblur most common event-listener.

**Blocking I/O **takes time and hence block other function. Consider the scenario where we want to fetch data from the database for two different users. Here we can not get the data of the second user until we did not complete the first user process. Since javascript is a single threaded and here we would have to start a new thread every time we want to fetch user data. So here Non-Blocking I/O parts come in.

Example of Blocking I/O operation

<span class="hljs-keyword">const</span> fs = <span class="hljs-built_in">require</span>(‘fs’);
<span class="hljs-keyword">var</span> contents = fs.readFileSync(<span class="hljs-string">'package.json'</span>).toString();
<span class="hljs-built_in">console</span>.log(contents);

In** Non-blocking I/O **operations, you can get the user2 data without waiting for the completion of the user1 request. You can initiate both requests in parallel. **Non-blocking I/O **eliminates the need for the multi-threaded, since the system can handle multiple requests at the same time. That is the main reason which makes it very fast.

Example of Non-blocking I/O operation

<span class="hljs-keyword">const</span> fs = <span class="hljs-built_in">require</span>(‘fs’);
fs.readFile(<span class="hljs-string">'package.json'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">err, buf</span>)</span>{
    <span class="hljs-built_in">console</span>.log(buf.toString());

Note: You can learn more about the event loop and other things by going through this link.

What is Node Package Manager ( NPM )

It is is the official package manager for the node. It bundles automatically installed when you install node in your system. It is used to install new packages and manage them in useful ways. NPM install packages in two modes local and global. In the local mode, NPM installs packages in the node_module directory of the current working directory which location is owned by current user. Global packages installed in the directory where the node is installed and the location is owned by the root user.

What is the package.json

package.json is a plain JSON text file which manages all the packaged which you installed in your node application. Every Node.js applications should have this file at the root directory to describe the application metadata. A simple package.json file looks like below

    <span class="hljs-string">"name"</span> : <span class="hljs-string">"codesquery"</span>,
    <span class="hljs-string">"version"</span> : <span class="hljs-string">"1.0.0"'
    "repository": {
	"type" : "git",
	"url" : "github_repository_url"
    "dependencies": {
	"async": "0.8.0",
	"express": "4.2.x"

In the above file, name and versions are mandatory for the package.json file and rest is optional.

Installing Node.js

  • In Windows, you can install the node.js by using the installer provided by the official node.js website. Follow the installer instruction and node.js will be installed in your windows system.
  • In Linux OS, you can install the node.js by adding the PPA in your system and then install node js. Run the below command the terminal to install node js
sudo apt-get install curl python-software-properties
curl -sL https:<span class="hljs-comment">// | sudo -E bash -</span>
sudo apt-get install nodejs

  • In macOS, download the macOS installer from the official node.js website. Now run the installer by accepting the license and selecting the destination.

Test Node.js Installation

You can test the node.js installation by typing below command in the terminal

node -v

If node.js was installed successfully then you will see the installed version of the node in the terminal.

Frameworks and Tools

After gaining the popularity among the developers, there are so many frameworks built for the node js for the different type of uses. Here, I will tell you some of the most famous node js frameworks in the market

  • Express.js is the most popular framework for node.js development. A lot of popular websites is powered by express.js due to its lightweight.
  • Hapi.js is a powerful and robust framework for developing the API. This framework has features like input validation, configuration based functionality, error handling, caching and logging.
  • Metor.js is one of the most used frameworks in the node js web application development. This framework is backed by a huge community of developers, tutorials and good documentation.
  • is used to build a real-time web application like chat system and analytics. Its allow the bi-direction data flow between the web client and server.
  • Koa.js is yet another most used framework to build the web application using the node js. This framework is backed by the team behind Express.js. It allows you to ditch callbacks and increase error handling.


Today, Node.js shaping the future of web and application development technology. This is the just the basic of how node js works. If you want to build a scalable web application using the node js then you need to know more then this.

Till now, you have got the basic idea of node.js and now it is time to build something using the node.js. You can start with first by create a simple server using the node.js and then connect your node with MongoDB to perform the basic crud operation.