I need to programmatically access the current node version running in a library I am writing. Can\'t seem to find this in the docs.
Use semver to compare process.version
:
const semver = require('semver');
if (semver.gte(process.version, '0.12.18')) {
...
}
also instead of writing this whole as suggested by @alsotang
Number(process.version.match(/^v(\d+\.\d+)/)[1])
(not saying this is a bad solution).
you can simply write
parseFloat(process.versions.node);
it is versions (plural) not version
to get same or (similar) result and is easy to read
I had the similar issue with my codebase. I wanted to know the current NodeJs version I am going to use to run my server at runtime. For that, I wrote a code which can be run before starting the Server using npm run start
script.
Found below code helpful from this question.
'use strict';
const semver = require('semver');
const engines = require('./package').engines;
const nodeVersion = engines.node;
// Compare installed NodeJs version with required NodeJs version.
if (!semver.satisfies(process.version, nodeVersion)) {
console.log(`NodeJS Version Check: Required node version ${nodeVersion} NOT SATISFIED with current version ${process.version}.`);
process.exit(1);
} else {
console.log(`NodeJS Version Check: Required node version ${nodeVersion} SATISFIED with current version ${process.version}.`);
}
My package.json looks like this:
{
"name": "echo-server",
"version": "1.0.0",
"engines": {
"node": "8.5.0",
"npm": "5.3.0"
},
"description": "",
"main": "index.js",
"scripts": {
"check-version" : "node checkVersion.js",
"start-server" : "node app.js"
"start" : "npm run check-version && npm run start-server",
"test": "npm run check-version && echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"bluebird": "^3.5.1",
"express": "^4.16.3",
"good-guy-http": "^1.10.3",
"semver": "^5.5.0"
}
}
Do run npm install
command before you run npm run start
command to run your project.
If you need to only check for the major version, you can use this quick-and-dirty snippet:
const NODE_MAJOR_VERSION = process.versions.node.split('.')[0];
if (NODE_MAJOR_VERSION < 12) {
throw new Error('Requires Node 12 (or higher)');
}
Notes:
process.versions.node
is easier to work with than process.version
, as you do not have to worry about whether the version starts with a leading v
."0"
.Actually it would be better to use process.versions
object which provides a lot of versions for the different node components.
Example:
{
http_parser: '2.5.2',
node: '4.4.3',
v8: '4.5.103.35',
uv: '1.8.0',
zlib: '1.2.8',
ares: '1.10.1-DEV',
icu: '56.1',
modules: '46',
openssl: '1.0.2g'
}
I refined alsotang's answer a bit to compare versions:
const m = process.version.match(/(\d+)\.(\d+)\.(\d+)/);
const [major, minor, patch] = m.slice(1).map(_ => parseInt(_));
To perform an assertion, do it like this:
if (major >= 13 || (major >= 12 && minor >= 12)) {
console.log("NodeJS is at least v12.12.0. It is safe to use fs.opendir!");
}
This can be shortened to a one-liner to use in bash:
NODE_VERSION_CHECK=$(node -e "const v = process.version.match(/(\\d+)\.(\\d+)\.(\\d+)/).slice(1).map(_ => parseInt(_)); console.log(v[0] >= 13 || (v[0] >= 12 && v[1] >= 12))")
if $NODE_VERSION -eq "true" ;
then
echo "NodeJS is at least v12.12.0."
fi
or PowerShell:
$nodeVersion = $(node -e "const v = process.version.match(/(\d+)\.(\d+)\.(\d+)/).slice(1).map(_ => parseInt(_)); console.log(v[0] >= 13 || (v[0] >= 12 && v[1] >= 12))")
if ($nodeVersion -eq "true") {
Write-Host "NodeJS is at least v12.12.0."
}