【问题标题】:Node.js child process isn't receiving stdin unless I close the stdin stream除非我关闭标准输入流,否则 Node.js 子进程不会接收标准输入
【发布时间】:2018-01-11 17:03:44
【问题描述】:

我正在构建一个不和谐的机器人,它在 node.js 中包装了一个泰拉瑞亚服务器,因此服务器用户可以重新启动服务器和类似的操作。我已经完成了一半的工作,但我似乎无法创建一个命令来在泰拉瑞亚服务器上执行命令。我已将其设置为将命令写入子进程的标准输入,并且一些基本调试验证它确实如此,但显然没有任何反应。

在子进程标准输入的 Node.js 文档中,它说“请注意,如果子进程等待读取其所有输入,则在通过 end() 关闭此流之前,子进程将不会继续。 " 这似乎是问题所在,因为在其上调用 end() 函数实际上确实按预期发送了命令。也就是说,似乎很难相信我无法在不关闭它的情况下连续向标准输入发送命令。

这实际上是问题所在,如果是,我有什么解决方法?我的代码可以在下面找到。

const discordjs = require("discord.js");
const child_process = require("child_process");
const tokens = require("./tokens");

const client = new discordjs.Client();


const terrariaServerPath = "C:\\Program Files (x86)\\Steam\\steamapps\\common\\Terraria\\TerrariaServer.exe"
const terrariaArgs = ['-port', '7777', "-maxplayers", "8", "-world", "test.wld"]

var child = child_process.spawn(terrariaServerPath, terrariaArgs);

client.on('ready', () => {
    console.log(`Logged in as ${client.user.tag}!`);
});
client.on('disconnect', () => {
    client.destroy();
});

client.on('message', msg => {
    if (msg.channel.name === 'terraria') {
        var msgSplit = msg.content.split(" ");
        if (msgSplit[0] === "!restart") {
            child.kill();
            child = child_process.spawn(terrariaServerPath, terrariaArgs);
            registerStdio();
            msg.reply("restarting server")

        }
        if (msgSplit[0] === "!exec") {
            msg.reply(msgSplit[1]);
            child.stdin.write(msgSplit[1] + "\n");
            child.stdin.end();
        }
    }
});

client.login(tokens.discord_token);
var registerStdio = function () {
    child.stdout.on('data', (data) => {
        console.log(`${data}`);
    });

    child.stderr.on('data', (data) => {
        console.error(`${data}`);
    });
}
registerStdio();

【问题讨论】:

    标签: node.js stdin child-process


    【解决方案1】:

    我能够通过使用库node-pty 解决问题。据我所知,问题是子进程没有读取标准输入本身,我无法刷新它。 Node-pty 创建一个可以写入的虚拟终端对象,而不是标准输入。该对象不缓冲写入,因此任何输入都会立即发送到程序。

    【讨论】:

      猜你喜欢
      • 2018-08-29
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      • 2018-02-21
      • 1970-01-01
      相关资源
      最近更新 更多