You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 02:25:06