使用child_process
启动子进程,并与子进程通信的时候,发现会有多条打印结果,其原因是:不同的操作会触发stdin.write操作,而每一个操作都需要通过stdout.on来监听返回结果,如果使用stdout.on来监听返回结果,那么会一直处于监听状态。导致在其他操作进行stdin.write进行写操作的时候,也会被其他的stdout.on监听到。导致输出多条数据
代码:
// 钉钉扫码事件
ipcMain.on("ddcode", (event, args) => {
args.port += ""
let cmdStr = '' + JSON.stringify(args) + ''
log.info("钉钉扫码登陆参数:", cmdStr)
child.stdin.write(cmdStr + '\n')
child.stdout.on('data', (data) => {
log.info("钉钉扫码登陆结果:", returnString(data))
logintype = "other"
event.sender.send('ddlogin-result', returnString(data))
})
})
比如我以此进行了登陆操作,钉钉扫码操作,以及退出操作,那么当我进行最后的退出操作时,返回的的结果就会是这样的:
[2021-05-28 16:43:45.057] [info] 启动服务: {"msg":"登出成功","type":"0"}
[2021-05-28 16:43:45.058] [info] 获取钉钉apikey和redirect url结果: {"msg":"登出成功","type":"0"}
[2021-05-28 16:43:45.059] [info] 钉钉扫码登陆结果: {"msg":"登出成功","type":"0"}
[2021-05-28 16:43:45.060] [info] 注销账户结果: {"msg":"登出成功","type":"0"}
[2021-05-28 16:47:11.915] [info] 启动服务: {"msg":"启动正常","type":"0"}
可以看出打印了五条退出的信息,这就导致日志文件成倍的增加,这是一种错误的做法。
正确的做法,应该将stdout.on
改为stdout.once
,意思是只进行以此监听输出结果,就是针对每一个操作进行一次结果监听。
// 钉钉扫码事件
ipcMain.on("ddcode", (event, args) => {
args.port += ""
let cmdStr = '' + JSON.stringify(args) + ''
log.info("钉钉扫码登陆参数:", cmdStr)
child.stdin.write(cmdStr + '\n')
child.stdout.once('data', (data) => {
log.info("钉钉扫码登陆结果:", returnString(data))
logintype = "other"
event.sender.send('ddlogin-result', returnString(data))
})
})
那么我再次以此执行上面的操作,就只会打印一次输出结果:
[2021-05-28 16:48:44.603] [info] 钉钉扫码登陆参数: {"address":"192.168.0.116","auth":"dingding","port":"10000","type":"login","username":"ed39499295a135dfb2bbe4bcd46bc120"}
[2021-05-28 16:48:44.752] [info] 钉钉扫码登陆结果: {"msg":"登录成功","pwdinit":"false","time":"2021-05-28 16:48:44","type":"0","username":"陈青坤"}
[2021-05-28 16:48:53.273] [info] 注销账户结果: {"msg":"登出成功","type":"0"}