NODEJS SNIPPETS


ES MODULES

Hasta que sean nativos en nodejs 21.X la opcion es poner en package.json

{
  "type": "module"
}

o usar la extension mjs en lugar de js.


FETCH

async function fetchData(c, data) {
  const url = `${c.API_URL}${c.API_ENDPOINT}`;

  const options = {
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
      'Accept-Charset': 'utf-8'
    },
    body: new URLSearchParams({
      'key': c.API_KEY,
      'data': JSON.stringify(data)
    }).toString(),
  };

  try {
    const response = await fetch(url, options);
    if (response.ok) {
      const responseData = await response.json();
      return responseData;
    } else {
      throw new Error(`${response.status} ${response.statusText}`);
    }
  } catch (err) {
    console.log('ERROR fetchData => ', err);
  }
}

HTTP Request

GET

function makeHttpsRequest (path, callback) {
  https.get(path, (res) => {
    res.setEncoding('utf8');
    var body = '';
    res.on('data', (d) => {
      body += d;
    });
    res.on('end', () => {
      try {
        var parsed = JSON.parse(body);
      } catch (err) {
        console.error('Unable to parse response as JSON', err);
        return callback(err, null, null);
      }
      callback(null, res, parsed);
    });
  }).on('error', (err) => {
    console.error('Error with the request:', err.message);
    callback(err, null, null);
  });
}

POST, PUT ...

const querystring = require('querystring');

const parameters = querystring.stringify({
  'test': c.app.valid,
  'server': data.server,
  'data': data.data
});

const options = {
  timeout: 3000,
  hostname || host: 'api.codetabs.com',
  port: 443,
  path: '/api/resource',
  method: 'GET',
  headers: {
    'Authorization': 'Bearer ' + process.env.TOKEN_0,
    "Content-Type": 'x-www-form-urlencoded',
    "User-Agent": "user agent",
    'Accept': 'application/json',
    'Content-Length': Buffer.byteLength(parameters),
    'Accept-Charset': 'utf-8'
  }
};

makeRequest(options, parameters, function (err, res, data) {
  if (err !== null) {
    console.error('data sent FAIL => ', err);
    return;
  }
  console.log('data sent OK', data.server);
});

function makeRequest(options, parameters, callback) {
  const req = https.request(options, function (res) {
    let body = '';
    res.setEncoding('utf8');
    res.on('data', function (d) {
      body += d;
      // save all the data from response
      //console.log('BODY =>', body);
    });
    res.on('end', function () {
      //console.log('RES END');
      try {
        //console.log(body);
        var parsed = JSON.parse(body);
      } catch (err) {
        console.error('Unable to parse response as JSON', err);
        return callback(err, null, null);
      }
      callback(null, res, parsed);
    });
  });
  if (options.method !== 'GET') {
    req.write(parameters);
  }
  req.on('timeout', function () {
    //console.error('TIMEOUT');
    req.abort(); // lo envia a abort
  });
  req.on("abort", function () {
    callback("TIMEOUT", null, null);
  });
  req.on('error', function (err) {
    console.error('Error request  => ', err);
    // para evitar que salte 
    // Error: socket hang up
    // code: 'ECONNRESET'
    //console.log(err);
  });
  req.end();
}


// ASYNC POST REQUEST
try {
  const myRequest = await makeRequestAsync(options, parameters);
  console.log(myRequest);
} catch (err) {
  console.log(err);
}

function makeRequestAsync(options, parameters) {
  return new Promise((resolve, reject) => {
    const req = https.request(options, function (res) {
      let body = '';
      res.setEncoding('utf8');
      res.on('data', function (d) {
        body += d; // save all the data from response
      });
      res.on('end', function () {
        try {
          var parsedResponse = JSON.parse(body);
        } catch (err) {
          console.error('Unable to parse response as JSON', err);
          reject(err);
        }
        resolve(parsedResponse);
      });
    });
    if (options.method !== 'GET') {
      req.write(parameters);
    }
    req.on('timeout', function () {
      req.abort(); // send req to abort
    });
    req.on("abort", function () {
      reject("TIMEOUT");
    });
    req.on('error', function (err) {
      console.error('Error request  => ', err);
      // Avoid -> Error: socket hang up code: 'ECONNRESET'
    });
    req.end();
  });
}

FILES

read JSON

// sincrona
import { readFileSync } from 'fs';

function loadJsonFile() {
  try {
    const data = readFileSync('./data.json', 'utf8');
    return JSON.parse(data);
  } catch (err) {
    console.error('Error reading JSON file =>', err);
    return null;
  }
}

// asincrona
import { promises as fs } from 'fs';

async function loadJsonFile() {
  try {
    const data = await fs.readFile('./data.json', 'utf8');
    return JSON.parse(data);
  } catch (err) {
    console.error('Error reading JSON file =>', err);
  }
}

write JSON

// sincrona
import { writeFileSync } from 'fs';

function saveJsonFile(jsonData) {
  try {
    const data = JSON.stringify(jsonData, null, 2);
    writeFileSync('./data.json', data, 'utf8');
  } catch (err) {
    console.error('Error saving JSON file =>', err);
  }
}

// asincrona
import { promises as fs } from 'fs';

async function saveJsonFile(jsonData) {
  try {
    const data = JSON.stringify(jsonData, null, 2);
    await fs.writeFile("./data.json", data);
  } catch (err) {
    console.error("Error Saving JSON file => ", err);
  }
}

Get file from url

Descargar archivo a nuestro servidor con expressjs desde una url

const fs = require('fs');
const https = require('https');

function downloadFile (url, where, cb) {
  const file = fs.createWriteStream(where);
  https.get(url, function (response) {
    response.pipe(file);
    response.on('end', function (end) {
      cb(true);
    });
    response.on('error', function (err) {
      console.log('ERROR=', err);
      cb(false);
    });
  });
}

Readline file

const fs = require("fs");
const readline = require("readline");

function countLocFromTxt(filePath, cb) {
  const lineReader = readline.createInterface({
    input: fs.createReadStream(filePath)
  });
  let lineNumber = 1;
  lineReader.on('line', function (line) {
    console.log(lineNumber);
    lineNumber++;
  });
  lineReader.on('close', function () {
    cb(data);
  });
}

Upload File

npm install --save formidable

<form class="upload" method="post" enctype="multipart/form-data">
  <input type="file" class="input" id="inputFile" name="inputFile">
  <button type="submit" id="upload" class="action">UPLOAD</button>
</form>
const fs = require("fs");
const formidable = require('formidable');

const form = new formidable.IncomingForm();
form.parse(req, function (err, fields, files) {
  const filename = files.inputFile.name;
  const oldpath = files.inputFile.path;
  const newpath = __dirname + "/desired/path/uploads" + filename;
  fs.rename(oldpath, newpath, function (err) {
    if (err) throw err;
  });
});

NETWORK

get IP

function getIP(req) {
  return (
    req.headers['x-forwarded-for'] ||
    req.connection.remoteAddress ||
    req.socket.remoteAddress ||
    req.connection.socket.remoteAddress).split(',')[0];
}

check url exists

const https = require('https');
const url = require('url');

function checkUrlExists (urlchecked, cb) {
  const options = {
    method: 'HEAD',
    host: url.parse(urlchecked).host,
    path: url.parse(urlchecked).path
  };
  const req = https.get(options, function (response) {
    // console.log('STATUS=>', response.statusCode)
    cb(response.statusCode === 200);
  });
  req.end();
  req.on('error', function (err) {
    console.log('Error checking url => ', err);
    cb(false);
  });
}

ASYNC/AWAIT

// Ejemplo 1
function sleep(sleepTime) {
  return new Promise(function (resolve, reject) {
    setTimeout(resolve, sleepTime);
  });
}

async function go() {
  console.log('Starting');
  await sleep(1000);
  console.log('Ending');
}

// Ejemplo 2
async function doThings() {
  try {
    const exist = await existsRepo(url);
    console.log(exists);
  } catch(err) {
    console.error(err);
  }
}

function existsRepo (urlchecked) {
  return new Promise(function (resolve, reject) {
    lib.checkUrlExists(urlchecked, function (err, res) {
      if (err) {
        resolve(err);
      }
      resolve(res);
    });
  });
}

paralelismo

// Asi tarda 1000ms
async function series() {
  console.log("series");
  await wait(500);
  await wait(500);
  console.log("series done");
}

// Asi tarda 500ms
async function parallel() {
  console.log('parallel');
  const wait1 = wait(500);
  const wait2 = wait(500);
  await wait1;
  await wait2;
  console.log('parallel done');
}

// Asi tarda 500ms
async function parallel2() {
  console.log("parallel2");
  const [wait1, wait2] = await Promise.all([
    wait(500),
    wait(500),
  ]);
  console.log('parallel2 done');
}

series();
parallel();
parallel2();

MISC

Linux Commands

Sincronos

import { execSync } from "child_process";

const createNewDir = `cd ${origin} && mkdir ${newDir}`;

try {
  const modes = ["dev", "production"];
  const mode = modes[action];
  if (mode === "dev") {
    console.log(createNewDir);
  }
  if (mode === "production") {
    execSync(createNewDir);
  }
} catch (err) {
  console.error('Error =>', err);
}

Asincronos


import { exec } from 'child_process';

// callbacks
function runCommandCB(command, cb) {
  exec(command, function (err, stdout, stderr) {
    if (err) {
      console.error(`Error executing "${command}" =>`, err);
      cb(err, stderr || stdout);
      return;
    }
    if (stderr) {
      console.warn(`Warn executing "${command}" =>`, stderr);
      cb(null, stderr);
      return;
    }
    cb(null, stdout);
  });
}

runCommandCB(command, function (err, output) {
  if (err) {
    console.log("Err => ", err);
  } else {
    console.log("Output => ", output);
  }
});

// promises 
function runCommand(command) {
  return new Promise(function (resolve, reject) {
    exec(command, function (err, stdout, stderr) {
      if (err) {
        console.error(`Error executing "${command}":`, err);
        reject(new Error(`Execution failed: ${stderr || stdout}`));
        return;
      }
      if (stderr) {
        console.warn(`Warning executing "${command}":`, stderr);
        resolve(stderr);
        return;
      }
      resolve(stdout);
    });
  });
}

// usar con promises
runCommand(command)
  .then(function (output) {
    console.log("Output => ", output);
  })
  .catch(function (err) {
    console.log("Err => ", err);
  });

// usar con async/await
async function doCommand(command) {
  try {
    const output = await runCommand(command);
    console.log("Output => ", output);
  } catch (err) {
    console.log("Err => ", err.message);
  }
}

pm2 cluster

  • Buscar un proceso
if (process.env && process.env.pm_id) {
  if (process.env.pm_id === '0') {
    onceADayTask();
  }
}

if (process.env && process.env.pm_id) {
  //running in pm2 
  if (process.env.pm_id % os.cpus().length !== 0) {
    return;
  } else {
    doTask();
  }
}