Calling and Executing C++ Code from Node.js
There is three general ways of integrating C++ code with a Node.js application - although there are lots of variations within each category like: Automation, Shared Library and Addon. Each of them has advantage and disadvantage as well
It’s not that hard to execute C++ code with JavaScript. NodeJS can not only load and/or execute the JavaScript libraries and/or files, but also be extended with native modules (compiled C/C++ code). While this does not mean that you should wipe out your existing JavaScript modules into C++, this knowledge might come in handy in specific use cases.
Prerequisite
You will also need below tools installed on your machine, if you are using macOS those are preinstalled :
- make
- g++
- python2.7
We are ready to compile our first C++ code into native modules. We will write a simple c++ code that will check whether given number is a prime number and return boolean (true or false) value. So Create a .cpp file (I named it prime.cpp)
// prime.cpp
#include <nan.h>
NAN_METHOD(IsPrime) {
    if (!info[0]->IsNumber()) {
        Nan::ThrowTypeError("argument must be a number!");
        return;
    }
    int number = (int) info[0]->NumberValue();
    if (number < 2) {
        info.GetReturnValue().Set(Nan::False());
        return;
    }
    for (int i = 2; i < number; i++) {
        if (number % i == 0) {
            info.GetReturnValue().Set(Nan::False());
            return;
        }
    }
    info.GetReturnValue().Set(Nan::True());
}
NAN_MODULE_INIT(Initialize) {
    NAN_EXPORT(target, IsPrime);
}
NODE_MODULE(addon, Initialize);
Now install following node_moduels nan node-gyp and update your package.json like this :
{
  "name": "calling-cpp-into-nodejs",
  "version": "1.0.0",
  "dependencies": {
    "nan": "^2.6.1",
    "node-gyp": "^3.6.0"
  },
  "scripts": {
    "compile": "node-gyp rebuild",
    "start": "node test.js"
  },
  "gypfile": true
}
Here in the “scripts” section:
- "compile": "node-gyp rebuild"— for C++ code compilation
- "start": "node main.js"— for our main executable script ```
Now create a bindings.gyp fie (It’s a Configuration file for node-gyp) and add your prime.cpp file  in the array under sources:
{
  "targets": [
    {
      "include_dirs": [
        "<!(node -e \"require('nan')\")"
      ],
      "target_name": "addon",
      "sources": [ "prime.cpp" ]
    }
  ]
}
Yeah! We are done. Now it’s time to compile your C++ file run npm run compile it will start node-gyp for compiling our C++ files from bindings.gyp sources and output should be like (if everything is okay):
node-native-addons-example@1.0.0 compile /Users/marcin/projects/node-native-addons-example
node-gyp rebuild
CXX(target) Release/obj.target/addon/main.o
SOLINK_MODULE(target) Release/addon.node
Yepiee! you are ready to use your first compiled native module. For testing we are using a .js file named test.js and its look like below :
const {IsPrime} = require('./build/Release/addon'); // native c++
const number = 654188429; // thirty-fifth million first prime number (see https://primes.utm.edu/lists/small/millions/)
console.time('start ....');
console.log(`checking whether ${number} is prime... ${IsPrime(number)}`);
console.timeEnd('finished ...');
We are done! Happy Coding :)
