NodeJS

From David's Wiki
\( \newcommand{\P}[]{\unicode{xB6}} \newcommand{\AA}[]{\unicode{x212B}} \newcommand{\empty}[]{\emptyset} \newcommand{\O}[]{\emptyset} \newcommand{\Alpha}[]{Α} \newcommand{\Beta}[]{Β} \newcommand{\Epsilon}[]{Ε} \newcommand{\Iota}[]{Ι} \newcommand{\Kappa}[]{Κ} \newcommand{\Rho}[]{Ρ} \newcommand{\Tau}[]{Τ} \newcommand{\Zeta}[]{Ζ} \newcommand{\Mu}[]{\unicode{x039C}} \newcommand{\Chi}[]{Χ} \newcommand{\Eta}[]{\unicode{x0397}} \newcommand{\Nu}[]{\unicode{x039D}} \newcommand{\Omicron}[]{\unicode{x039F}} \DeclareMathOperator{\sgn}{sgn} \def\oiint{\mathop{\vcenter{\mathchoice{\huge\unicode{x222F}\,}{\unicode{x222F}}{\unicode{x222F}}{\unicode{x222F}}}\,}\nolimits} \def\oiiint{\mathop{\vcenter{\mathchoice{\huge\unicode{x2230}\,}{\unicode{x2230}}{\unicode{x2230}}{\unicode{x2230}}}\,}\nolimits} \)

Node.js is a JavaScript environment based on Chrome's V8 JavaScript engine.
Node Package Manager (npm) is used to manage node packages installed on your computer or used in your node projects.
This page is primarilly on node-specific APIs and usage. See also JavaScript and TypeScript.

Installation

Linux

Using the Node Version Manager (nvm) is recommended.
This installs nvm in your home directory. You should never use sudo when using nvm or npm. Doing so could lead to permission issues.

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
source ~/.bashrc
nvm install --lts node
nvm install-latest-npm

Windows

You can install node directly or use nvm-windows.
Note that nvm-windows is not a port of nvm.

choco install nvm
nvm install lts

Usage

JavaScript files can be run directly using node index.js

Filesystem Access

Install fs-extra to your project.

const fs = require('fs-extra');
const path = require('path');

// Synchronous functions

//// Only in fs-extra
// Remove file or folder (rm -rf)
// Does nothing if path doesn't exist
fs.removeSync('/tmp/fileOrFolder');

// Creates a directory if it doesn't exist
// This example will create folder1 and folder2 if they don't exist
fs.ensureDirSync('/tmp/folder1/folder2');

//// Available in node's native 'fs'
// List all files and folders in a directory
fs.readdirSync('/tmp');

// Ensure file exists
try {
  fs.accessSync('etc/passwd', fs.constants.R_OK | fs.constants.W_OK);
  console.log('can read/write');
} catch (err) {
  console.error('no access!');
}

// Read an entire text file as a string
fs.readFileSync('temp.txt', 'utf8');

Paths

  • path.extname

Writing to a file

Reference

const fs = require('fs-extra');

let pw = 'My_password_is_kkk';

fs.writeFileSync('pw.txt', pw);

Logging

Mostly the same as web JavaScript.
Reference

console.log("a", "b");

console.error("to stderr");

CSV

Install csv from npm.
Reference

Running other processes

You can invoke other processes or CLI programs using spawn or spawnSync

const {spawn, spawnSync} = require('child_process');

Example:

spawnSync("ffmpeg", flatten([
  "-i", file,
  "-c:v libx265 -crf 28 -preset medium -c:a libopus -b:a 128K".split(" "),
  "-y", output_path
]), {
  cwd: process.cwd(),
  env: process.env,
  stdio: [process.stdin, process.stdout, process.stderr],
  encoding: 'utf-8'
});

Debugging

Inspector

  • Add the --inspect flag to your node call (before the name of the script).
  • Then go to chrome://inspect

Package Management

NPM

To add node packages to an new project. Use npm init
To download the dependencies for a node project, run npm install or npm ci.
npm install installs the latest dependencies listed in package.json subject to the requirements listed in that file. It also updates package-lock.json.
npm ci installs exact versions from the package-lock.json.

Yarn

Yarn is an alternative to npm. It caches packages on disk to speed up installs. While you can migrate from npm to yarn, it is recommended to stick to a single package manager since they each use their own lockfile.

pnpm

pnpm uses symlinks to a single copy of each dependency to save disk space. pnpm uses its own lockfile instead of packages-lock.json.

Publishing

See Npm (software)#Publishing.

Useful Packages

fs-extra

fs-extra adds additional commands for accessing the filesystem such as copying and moving files.

node-fetch

node-fetch

file-type

file-type
file-type-cli
Detects the file type of a file or buffer

argparse

argparse

This is a port of python's argparse. However, it does not support configuration files.

Example
const parser = new ArgumentParser({
  version: "0.0.1",
  addHelp: true,
  description: "Description here"
});
// Add your arguments here
parser.addArgument(["--config"], {
  type: String,
  help: "Path to config file (optional)"
});
const args = (function() {
  let myArgs = parser.parseArgs();
  if (myArgs.config && myArgs.config.length > 0) {
    const filedata = fs.readFileSync(myArgs.config, "utf8");
    const myArgsArr = filedata
      .split("\n")
      .filter(x => x.length > 0)
      .map(x => "--" + x)
      .map(x => x.split("="))
      .flatten();
    myArgs = parser.parseArgs(myArgsArr);
  }
  return myArgs;
})();

node-worker-threads-pool

Link
A cool thread pool implementation.