Node js,使用 exec 启动 Discord.js bot,不正确 运行

Node js, starting Discord.js bot using exec, doesn’t properly run

假设我有 2 个文件,a.js 和 b.js,其中 a.js 是一个简单的 node.js 脚本,它调用 b.js 这是一个Discord.js 机器人。

a.js

const { exec } = require(‘child_process’);
exec(‘node b.js’, (err,stdout,stderr) => {
console.log(‘err: ‘ + err + ‘\n stdout: ‘ + stdout + ‘\n stderr:‘ + stderr);
});

b.js

const Discord = require(‘discord.js’);
const fs = require(‘fs’);
var bot = new Discord.Client();
var token;
fs.readFile(‘token.txt’,(err,data) => {
    if(err){console.log(err); process.exit(0);}
    token = data;
});
bot.on(‘ready’,()=>{console.log(‘ready’);});
bot.on(‘message’, message => {
    if(message.content == ‘ping’){
        message.channel.send(‘pong’);
    }
});
bot.login(token);

当我运行a.js时,唯一的输出是

err:
stdout:
stderr:

a.js 然后终止,看起来好像 b.js 永远不会 运行。 我想知道为什么会发生这种情况以及为什么。 此外,如果有人想知道我为什么要这样做,我将它作为一个更大的脚本的一部分,并将问题归结为这个。主要部分是 b.js 必须是来自 exec 的 运行。我在 Windows 10 中 运行 使用最新版本的节点和 Discord.js 对此进行了调整。谢谢

我用 b.js 在 运行ning a.js 试了一下,除了我把 b.js 简单地改成了 console.log

a.js

const { exec } = require('child_process');
exec('node b.js', (err,stdout,stderr) => {
console.log('err: ' + err + '\n stdout: ' + stdout + '\n stderr:' + stderr);
});

b.js

console.log("B was called");

然后当我 运行 节点 a.js 我得到;

node .\a.js
err: null
 stdout: B was called

 stderr:

我猜测存在路径问题,A 无法找到 B 相对于它被调用的位置?

我又做了一次尝试,但是当完成完整的 discord 机器人设置时...

我的a.js看起来像这样...

const { spawn } = require('child_process');

const child = spawn('node',['b.js']);

process.stdin.pipe(child.stdin);

child.stdout.on('data', (data) => {
  console.log(`child stdout:\n${data}`);
});

child.stderr.on('data', (data) => {
    console.log(`child stderr:\n${data}`);
});

我的 b.js 看起来像这样...

const Discord = require('discord.js');
const fs = require('fs');
var bot = new Discord.Client();
var token;
fs.readFile('token.txt', {encoding: 'utf8'}, (err,token) => {
    if(err){console.log(err); process.exit(0);}

    bot.on('ready',()=>{
            console.log('ready');
    });
    bot.on('message', message => {
        if(message.content == 'ping'){
            message.channel.send('pong');
        }
    });

    bot.login(token);
});

b.js 上,我必须 utf8 读取文件,并确保我的 token.txt 文件没有尾随和前导白色 space。另外,我将机器人登录代码移到了读取的令牌文件的回调中。

下面的输出示例...

我在 discord 上发送了 ping 看它是否有效,bot 回应了 pong。

截图如下。

我希望这段代码对你有用,让我知道...