【问题标题】:Nodemon suddenly stuck in "clean exit - waiting for changes before restart" after adding discord.js command添加 discord.js 命令后,Nodemon 突然卡在“干净退出 - 重启前等待更改”
【发布时间】:2021-09-21 13:52:39
【问题描述】:

我在 vs 代码上使用 node.js + discord.js,这也是我第一次编码,所以请原谅我丑陋的格式等。 一切都是最新的,并且运行得非常好,直到它只是......没有。这让我发疯了,没有一个对其他人有用的解决方案对我有用。 我正在关注 this 教程,但为了个性化我的机器人而偏离了它。

Index.js

require('dotenv').config();

const {
    Client,
    Message,
    User,
    ClientUser,
    GuildMember,
    ClientApplication,
    Guild
} = require('discord.js');

const client = new Client({
    intents: ["GUILDS", "GUILD_MESSAGES", "GUILD_MESSAGE_TYPING", "GUILD_PRESENCES"]
});

const prefix = '!';

client.on('ready', () => {
    console.log('SHOWTIME!!');
    client.user.setStatus('idle');
});

client.on("message", (message) => {// EventEmitter
    if (message.content == "!ping") { // Check if message is "!ping"
        message.channel.send("Pinging ...") // Placeholder for pinging ... 
            .then((msg) => { // Resolve promise
                msg.edit("Pong! " + (Date.now() - message.createdTimestamp)); // Edits message with current timestamp minus timestamp of message
            });
    }
});

client.on("message", (message) => {
    if (message.author.bot) return; {
        if (message.content == "!help") {
            message.channel.send("What can I help you with?")
                .then((message) => {
                    message.react("1️⃣").then(_e => {
                        message.react("2️⃣").then(_e => {
                            message.react("⏹");
                        });
                    });
                });
        }
    }

    client.on("message", (message) => {
        if (message.content == "!ns") {
            (message.react)("????");
            message.reply('The next session is scheduled for ...!');
        }
    });

    client.on("message", async (message) => {
        if (message.author.bot) return; {
            if (message.content == "!uptime") {
                (message.react)("✨");
                let days = Math.floor(client.uptime / 86400000);
                let hours = Math.floor(client.uptime / 3600000) % 24;
                let minutes = Math.floor(client.uptime / 60000) % 60;
                let seconds = Math.floor(client.uptime / 1000) % 60;
                message.channel.send((`__I have been online for...__\n${days}d ${hours}h ${minutes}m ${seconds}s!`));
            }
        }
    });

    client.login(process.env.token_renren);
});

package.JSON

{
  "name": "renren_v2",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node ./src/index.js",
    "dev": "nodemon ./src/index.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "discord.js": "^13.1.0",
    "dotenv": "^10.0.0",
    "express": "^4.17.1"
  },
  "devDependencies": {
    "nodemon": "^2.0.12"
  }
}

终端中不断出现的消息:

[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node ./src/index.js`
[nodemon] clean exit - waiting for changes before restart

具体来说,在我添加 特定命令后,Nodemon 停止工作:

client.on("message", (message) => {
    if (message.author.bot) return; {
        if (message.content == "!help") {
            message.channel.send("Hm? What can I help you with?")
                .then((message) => {
                    message.react("1️⃣").then(_e => {
                        message.react("2️⃣").then(_e => {
                            message.react("⏹");
                        });

我在它第一次给我错误后将其删除,但将其添加回来查看是否是问题所在。将其添加回来后,将其删除将不再使 nodemon 工作。我已经尝试卸载、将其安装为项目开发、清理安装节点等,但到目前为止没有任何效果。

【问题讨论】:

  • 那里有大量的消息事件处理程序......你应该只有一个client.on("message")。为什么在`if (message.author.bot) return;`之后开始一个块?为什么要将客户端登录到消息处理程序中?
  • 哇,我什至没有注意到我将登录名放在了消息处理程序中。现已修复,非常感谢您提供的信息。另外,client.on("message") 是因为我不断收到“已声明但从未定义的消息”错误,并且放置它可以解决它,但我想我应该研究更多的机器人代码并从它们的编码中学习。跨度>

标签: javascript node.js discord.js nodemon


【解决方案1】:

clean exit 表示您的程序完成且没有任何错误。这正是您的程序当前所做的。您定义了很多事件侦听器,但您的机器人本身从未启动。

正如@Zsolt 所指出的,您当前在消息处理程序中登录您的不和谐客户端。这意味着,机器人必须在启动之前收到一条消息。但由于您的机器人没有登录,这永远不会发生。

您需要将登录调用移动到脚本的底部,然后它应该可以工作:

client.login(process.env.token_renren)

关于代码结构的注释:

您正在为一个事件定义多个侦听器。虽然这可行,但您无法控制调用侦听器的顺序,这可能会导致意外行为。正如@Zsolt 指出的那样,您通常定义一个 message 侦听器,然后将事件传递给处理不同消息的特定函数。

您还更改了很多thens,这会使代码非常难以阅读(这称为callback hell)。您可以使用async 函数来避免这种情况:

async function handleMessage(message) {
    if (message.author.bot) return

    if (message.content == "!help") {
        let response = await message.channel.send("What can I help you with?")
        await response.react("1️⃣")
        await response.react("2️⃣")
        await response.react("⏹")
   }
} 

client.on("message",  handleMessage) 

这使得代码更浅,更容易发现消息处理程序中的login 调用等内容。

此外,如今大多数 IDE 都提供自动代码格式化功能。除非您正在处理没有使用此功能的大型存储库,否则我强烈建议您偶尔运行一次。我为我的代码启用了“保存格式”并习惯了它,但这是个人喜好(尽管它确实可以节省时间,一些雇主甚至可能需要它)。这使得很容易发现错误的缩进和奇怪的格式,比如你的if (message.author.bot) return; {

【讨论】:

  • 移动登录已修复,谢谢!说真的,非常感谢您的建议。我确实在 VS 代码上单击了“格式化文档”,这就是它的表达方式。我应该获得代码扩展还是坚持使用 VS 代码中内置的扩展?正如我所提到的,在编码方面我是一个超级菜鸟,所以我主要只是从其他机器人布局/教程/等中编译信息,所以任何额外的建议都会有很大帮助。
  • 我认为如果您喜欢它的格式化和单独工作,内置格式化程序非常好。当涉及更多人时,通常使用基于节点的格式化程序来执行编码标准。 EsLintprettier 很流行,它们都有针对所有主要 IDE 的相应扩展。否则,其他存储库总是一个很好的资源。库本身提供的文档示例也是如此。
猜你喜欢
  • 1970-01-01
  • 2018-07-10
  • 2021-09-07
  • 2018-08-06
  • 2021-05-15
  • 2020-11-07
  • 2021-05-28
  • 2022-01-20
  • 2022-01-15
相关资源
最近更新 更多