child_process.exec调用jshint失败的问题(已解决)
发布于 7 年前 作者 SHocker-Yu 3304 次浏览 来自 问答

已解决:换成spawn()

var spawn = require('child_process').spawn;

var spawnObj = spawn('node', ['C:/Users/Administrator/AppData/Roaming/npm/node_modules/jshint/bin/jshint', 'E:/jenkins/workspace/jenkinsNotify_99uIM/plugin/send_message.js'], { encoding: 'utf-8' });
spawnObj.stdout.on('data', function (chunk) {
    console.log('result: ' + chunk.toString());
});

spawnObj.stderr.on('data', function (err) {
    console.log('err: ' + err);
});

spawnObj.on('close', function (code) {
    console.log('close code: ' + code);
});

问题: 目前项目使用jshint包来进行静态代码检测,需要对检测的结果进行处理,目前demo在调用jshint对文件进行检测时失败。

npm install -g jshint (全局安装)

代码: var exec = require('child_process').exec; var shell = 'jshint E:/jenkins/workspace/jenkinsNotify_99uIM/plugin/send_message.js'; exec(shell, function (err, stdout, stderr) { if (err) { console.error(err); return; } console.log(stdout); });

执行结果: image.png

目前判断是jshint作为命令开头,是需要在node或者说Npm的环境下才能执行,有伙伴遇到过吗?

在git上看到一个issue,但是加了call 也还是一样的报错,issue地址:https://github.com/jshint/jshint/issues/2819 image.png

感觉可以通过下面的命令来解决,但是不知道怎么下手 image.png

今天踩得坑: 1、一开始用来调用shell命令的函数是child_process.exec()
官网上介绍:(1)传入 exec 函数的 command 字符串会被 shell 直接处理 (2)注意:不要把未经检查的用户输入传入到该函数。 任何包括 shell 元字符的输入都可被用于触发任何命令的执行

使用该函数执行cd…&git diff命令OK,但是执行node XXXX等其他命令无法生效,目前没有明确的概念来解释为什么,只是踩坑踩出来的。 因为cd…&git diff命令生效,所以当exec()无法执行Jshint命令时没有第一时间定位到函数的问题,加上jshint 制成 bat批处理会闪退,以为是jshint执行环境不对造成的,加上call只是针对bat闪退,而代码中是exec()函数本身对要执行语句的要求较严格,后来通过对jshint执行的原理进行梳理,对源码进行打印,定位到node jshint 时没有传入的参数,这才想到exec()函数是否存在问题,换成spawn()之后成功。

回到顶部