javascript - 同步 spawn 和流事件输出 NodeJS
问题描述
我想使用 NodeJS 运行一组测试脚本,它在执行时输出测试结果。我希望这些不同的测试脚本同步运行,并在执行时输出结果。
我尝试使用子进程的 spawnSync() 函数,但是在命令执行期间它不输出数据。
const { spawnSync } = require("child_process")
const cmd = spawnSync('./gradlew',['test'],{cwd : '../../../'})
console.log(`Output: ${cmd.stdout}`)
上述代码仅在任务完全执行完成时才输出结果。我相信这是 spawnSync 的预期行为。
因此,我尝试在带有 await 的异步函数中运行 spawn() 来同步它,我不确定这种方法是否正确。
const { spawn } = require("child_process")
const cmd = spawn('./gradlew',['test'],{cwd : '../../../'})
const cmd1 = spawn('./gradlew',['test'],{cwd : '../../../'})
async function runFeature(){
console.log("Running feature....")
cmd.stdout.on('data', (data) => {
console.log(`Output: ${data}`);
});
}
async function runFeature1(){
console.log("Running feature 1....")
cmd1.stdout.on('data', (data) => {
console.log(`Output1: ${data}`);
});
}
async function main(){
try{
console.log("Starting...")
await runFeature()
await runFeature1()
process.exit(0)
} catch(e){
console.error(e)
process.exit(1)
}
}
main()
运行上述代码时,命令结束,没有任何输出,如下所示。看起来该cmd.stdout.on()
方法没有被执行。
harrym@HarryM:~/Project/test$ node run-test.js
Starting..
Running feature....
Running feature 1....
harrym@HarryM:~/Project/test$
这种方法有什么问题吗?我真的需要帮助来调试这个问题。此外,在输出实时数据流时同步子进程的任何建议都将受到高度赞赏。
先感谢您 :)
解决方案
如果您使用节点 10 或更高版本,则可以使用如下通用迭代器函数:
const { spawn } = require('child_process');
(async () => {
try {
const lsSpawn = spawn('ls', ['-l'], { cwd: '../../../' });
let error = '';
for await (const chunk of lsSpawn.stderr) {
error += chunk;
}
if (error) {
console.error('error', error);
return;
}
let data = '';
for await (const chunk of lsSpawn.stdout) {
data += chunk;
}
if (data) {
console.log('data', data);
}
} catch (e) {
console.error('execute error', e);
}
})();
我用for await
在lsSpawn.stderr
和lsSpawn.stdout
提示:如果你想使用 promise don't mix-up with event.on
,你应该转换event.on
成 promise 格式
推荐阅读
- swift - 如何使用 readerSession(_:didDetect:) 读取多个 nfc 标签
- r - 如何根据r中数据框中的其他数字重复列重新组织列?
- reactjs - 在 Heroku 上使用 Docker-Compose 部署 React 前端、FastApi 后端
- java - 我如何与测试团队共享 .aab
- google-apps-script - 谷歌表单 - 向提交添加唯一标识符 - 不使用数组公式
- javascript - 验证表单中单击提交按钮上的输入
- xcode - 应用关闭时出现奇怪的错误消息:“CALayer 位置包含 NaN:[nan nan]”
- monitoring - 使用 url 将 grafana 仪表板插入 zabbix 屏幕
- javascript - 为虽然屏幕(TouchEvent)进行擦除工作
- flutter - Flutter:更改轮廓按钮的边框颜色