【发布时间】: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