Как обработать устаревшую ошибку npm в node.js

#node.js #npm

Вопрос:

Четкая, умная программа, написанная в node.js вызов устаревшего npm приведет к сбою в node.js v16.11.

Пример:

 const util = require('util');
const execPromisified = util.promisify(require('child_process').exec);

async function main() {
  try {
    const resultat = await execPromisified('npm outdated -g --depth=0');
    console.log(resultat);
  } catch (err) {
    console.log(err);
  }
}

main();
 

Очевидно, это не удается, потому что ребята из npm не следуют соглашению о статусе выхода.

 C:temp>node p1.js
Error: Command failed: npm outdated -g --depth=0

    at ChildProcess.exithandler (node:child_process:397:12)
    at ChildProcess.emit (node:events:390:28)
    at maybeClose (node:internal/child_process:1064:16)
    at Process.ChildProcess._handle.onexit (node:internal/child_process:301:5) {
  killed: false,
  code: 1,
  signal: null,
  cmd: 'npm outdated -g --depth=0',
  stdout: 'Package             Current   Wanted   Latest  Location                         Depended byn'  
    '@types/node         16.10.5  16.10.8  16.10.8  node_modules/@types/node         globaln'  
    'ts-node              10.2.1   10.3.0   10.3.0  node_modules/ts-node             globaln'  
    'typescript            4.4.3    4.4.4    4.4.4  node_modules/typescript          globaln'  
    'webpack-dev-server    4.3.0    4.3.1    4.3.1  node_modules/webpack-dev-server  globaln',
  stderr: ''
}
 

Ответ №1:

2-я попытка, с этим исключением обработана

 const exec = require('child_process').exec;

function execAsync (command) {
  return new Promise(function (resolve, reject) {
    exec(command, (error, stdout, stderr) => {
      if (stderr !== '') {
        reject(stderr);
      } else {
        resolve(stdout);
      }
    });
  });
}

async function main() {
  try {
    const resultat = await execAsync('npm outdated -g --depth=0');
    console.log(resultat);
  } catch (err) {
    console.log(err);
  }
}

main();
 

Более ясно, как видно (иронично), но эй, это работает!!!

 C:temp>node p2.js
Package             Current   Wanted   Latest  Location                         Depended by
@types/node         16.10.5  16.10.8  16.10.8  node_modules/@types/node         global
ts-node              10.2.1   10.3.0   10.3.0  node_modules/ts-node             global
typescript            4.4.3    4.4.4    4.4.4  node_modules/typescript          global
webpack-dev-server    4.3.0    4.3.1    4.3.1  node_modules/webpack-dev-server  global