Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我的discord.js机器人似乎同时运行多个实例_Javascript_Node.js_Discord_Discord.js - Fatal编程技术网

Javascript 我的discord.js机器人似乎同时运行多个实例

Javascript 我的discord.js机器人似乎同时运行多个实例,javascript,node.js,discord,discord.js,Javascript,Node.js,Discord,Discord.js,所以我想做的是一个简单的机器人,可以检测命令。我犯了一个错误!test”命令,该命令执行一些操作(回复消息,删除消息,然后稍后删除答案,但还将命令记录在通道中) 它似乎工作得相当好,但是它会多次抛出答案并执行一系列操作:(每次我重新启动bot时都会越来越多) 我试图删除应用程序并重新创建它,但效果很好:消息只显示了一次,直到我重新启动机器人 我犯了一个错误!“停止”命令销毁客户端,但它不能按预期工作:机器人已断开连接(在我的控制台中称为“停止”),但几乎立即在我的服务器上重新连接(并且我在本地控

所以我想做的是一个简单的机器人,可以检测命令。我犯了一个错误!test”命令,该命令执行一些操作(回复消息,删除消息,然后稍后删除答案,但还将命令记录在通道中)

它似乎工作得相当好,但是它会多次抛出答案并执行一系列操作:(每次我重新启动bot时都会越来越多)

我试图删除应用程序并重新创建它,但效果很好:消息只显示了一次,直到我重新启动机器人

我犯了一个错误!“停止”命令销毁客户端,但它不能按预期工作:机器人已断开连接(在我的控制台中称为“停止”),但几乎立即在我的服务器上重新连接(并且我在本地控制台中再也看不到日志)

关于消息的数量,似乎有点“随机”。有些bot消息有时根本不会被删除,也不会被记录

这是我的代码(我以前从未真正在js中做过任何事情,所以我可能会误用一些东西,或者有些东西可能不是最优的,对此我很抱歉——我做了一些研究,我认为大多数事情都是好的,或者至少是像样的)

//需要libs
require('dotenv').config()
const Discord=require('Discord.js');
//获取不一致客户端
var client=newdiscord.client();
初始化();
// --------------------------------------------------
//初始化
// --------------------------------------------------
函数初始化(){
//准备就绪
client.on(“ready”,function()){
log(`Logged as${client.user.tag}!是的,这是默认消息。`);
});
//留言
client.on(“消息”,函数(输入){
//服务器消息
if(input.guild.available){
//获取消息内容
var命令=input.content.toLowerCase();
//停止命令
if(command.startsWith(“!stop”)){
client.destroy();
控制台日志(“停止”);
}
//测试命令
else if(command.startsWith(“!test”)){
回答(`这是我对你的测试的答案!`)
.then(函数(输出){
consumer命令(输入,输出,5000);
})
.catch(控制台错误);
}
}
});
//登录bot客户端
client.login(process.env.BOT_令牌);
}
// --------------------------------------------------
//领事和日志命令
// --------------------------------------------------
//记录命令的输出,删除输入消息并尽快删除输出
//输入,消息,用户消息
//输出string是bot输出
//outputTimeout,int是我们应该等待的时间,直到删除bot的输出
功能命令(输入、输出、输出){
//删除输入
输入。删除(0)
.然后(函数(){
console.log(`Deleted message${input.content}`)
})
.catch(控制台错误);
//日志
var logChannel=input.guild.channels.find(channel=>channel.name===“guibot命令”);
if(logChannel!=null){
日志命令(输入、输出、日志通道);
}否则{
log(“尝试记录bot命令,但没有guibot命令通道”);
}
//如果不为空,请稍后删除输出
if(output!=null&&outputTimeout!=null){
}
}
//记录命令的输出
//输入,消息,用户消息
//msg,message,用户消息
//输出string是bot输出
功能日志命令(输入、输出、日志通道){
//有输出
if(输出!=null){
logChannel.send(`@${input.author.username}发送了一个命令`{
嵌入:{
字段:[
{
名称:“:键盘:输入:”,
值:`\`${input.content}\``
},
{
名称:“:机器人:输出:”,
值:`\`${output.content}\``
}
]
}
})
。然后(()=>console.log('Logged user action'))
.catch(控制台错误);
}
//无输出
否则{
logChannel.send(`@${input.author.id}发送了一个命令(未找到任何输出)`{
嵌入:{
字段:[
{
名称:“:键盘:输入:”,
值:`\`${input.content}\``
}
]
}
})
.然后(函数(){
console.log('记录的用户操作')
})
.catch(控制台错误);
}
}

所以,我的问题是:如何确保我的代码只运行一个实例?(如果我正确地扣除了这个问题)。感谢您的帮助。谢谢

您不需要创建initialize()方法,只需这样做:

// Require libs
require('dotenv').config()
const Discord = require('discord.js');

// Get discord client
var client = new Discord.Client();

// On ready
client.on("ready", function() {
    console.log('Logged in as ${client.user.tag}! Yup, this is the default message.');
});

// On message
client.on("message", function(input) {
    // server message
    if (input.guild.available) {
        // get the message content
        var command = input.content.toLowerCase();
        // stop command
        if (command.startsWith("!stop")) {
            client.destroy();
            console.log("Stopped");
        }
        // test command
        else if (command.startsWith("!test")) {
            input.reply('This is my answer to your test !')
                .then(function(output) {
                    consumeCommand(input, output, 5000);
                })
                .catch(console.error);
        }
    }
});

// --- CONSOLE AND LOG COMMANDs go here ---

// login bot client
client.login(process.env.BOT_TOKEN);

只需像@slothiful建议的那样将其托管在Heroku上即可修复!我猜我的脚本只是一次又一次地重新启动,与discord服务器的连接成倍增加?没错。事实上,它现在工作正常,只有一个实例正在处理我的命令。

您是使用Heroku或其他服务来托管bot,还是从您的计算机上运行节点?@slothiful我在我的计算机上运行“npm run start”(其中start运行“node index.js”)。是的,我知道,只是我想使用一个函数,因为我更习惯Java,这让我感到不安x)它真的会影响性能还是什么?@GuillaumeVDN我只是不习惯用你的方式,我认为这是你的问题。。但是如果它仍然执行onready和onmessage,我想应该没问题