在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 by\n' +
'@types/node 16.10.5 16.10.8 16.10.8 node_modules/@types/node global\n' +
'ts-node 10.2.1 10.3.0 10.3.0 node_modules/ts-node global\n' +
'typescript 4.4.3 4.4.4 4.4.4 node_modules/typescript global\n' +
'webpack-dev-server 4.3.0 4.3.1 4.3.1 node_modules/webpack-dev-server global\n',
stderr: ''
}
发布于 2021-10-13 12:04:55
第二次尝试,但处理了该异常
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
https://stackoverflow.com/questions/69561697
复制相似问题