如何向Node.js子进程的stdin写入数据实现自动交互?
实现子进程自动输入完成ask-questions.js交互
问题说明
现有ask-questions.js是一个交互式脚本,运行时会依次输出问题,用户输入回答后触发下一个问题,完成后自动退出。尝试用spawn-questions.js通过child_process.spawn创建子进程,直接向stdin写入数据无法完成自动交互,需要调整代码实现按顺序自动输入回答。
问题原因
原代码中直接连续向子进程stdin写入所有回答,但子进程的交互是异步且按顺序触发的:必须等子进程输出一个问题后,再写入对应的回答,才会触发下一个问题输出。一次性写入所有回答会导致子进程还没准备好接收输入,数据无法被正确处理。
解决方案
修改spawn-questions.js,监听子进程的stdout输出,每当捕获到问题输出时,按顺序写入对应的回答,同时设置子进程的stdio编码确保数据正确传输。
修改后的spawn-questions.js代码
const path = require("path"); const { spawn } = require("child_process"); // 准备好对应问题的回答,顺序要和ask-questions.js的问题一致 const answers = ["25", "male", "Beijing"]; let answerIndex = 0; const childProcess = spawn("node", [path.join(__dirname, "ask-questions.js")], { env: process.env, stdio: ["pipe", "pipe", "inherit"], // 配置stdio,inherit可把子进程的stderr输出到当前终端 encoding: "utf8" // 设置编码,避免处理Buffer }); // 监听子进程的stdout输出,捕获问题后写入对应回答 childProcess.stdout.on("data", (data) => { console.log(`子进程输出:${data.trim()}`); if (answerIndex < answers.length) { const answer = answers[answerIndex++] + "\n"; // 加换行符模拟终端回车输入 childProcess.stdin.write(answer); console.log(`已自动输入:${answer.trim()}`); } }); // 监听子进程退出事件 childProcess.on("exit", (code) => { console.log(`子进程已退出,退出码:${code}`); }); // 处理子进程启动错误 childProcess.on("error", (err) => { console.error("子进程启动失败:", err); });
关键调整点
- 按顺序响应问题:通过监听子进程的
stdout,确保收到问题后再写入对应回答,匹配原脚本的交互逻辑。 - 添加换行符:终端输入以回车触发,每个回答后需加
\n,否则子进程的data事件不会触发。 - 设置编码:配置
encoding: "utf8",直接处理字符串而非Buffer,简化逻辑。 - 监听退出事件:可确认交互是否正常完成。
运行效果
执行spawn-questions.js后,会自动完成所有问题的回答,输出类似:
子进程输出:what is your age? 已自动输入:25 子进程输出:what is your gender? 已自动输入:male 子进程输出:where do you live? 已自动输入:Beijing 子进程输出:process - NO MORE QUESTIONS - EXIT! 子进程已退出,退出码:0
内容的提问来源于stack exchange,提问作者Inspiraller
相关产品推荐
相关产品推荐

