添加 discord.js 命令后,Nodemon 突然卡在 "clean exit - waiting for changes before restart"

Nodemon suddenly stuck in "clean exit - waiting for changes before restart" after adding discord.js command

我在 vs code 上使用 node.js + discord.js,这也是我第一次编码,所以请原谅我丑陋的格式等等。 一切都是最新的并且 运行 非常好,直到它......没有。这让我抓狂,none 对其他人有效的解决方案对我也有效。 我一直在关注 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 工作。我试过卸载、将其安装为项目开发人员、清理安装节点等,但到目前为止没有任何效果。

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

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

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

client.login(process.env.token_renren)

关于您的代码结构的注释:

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

您还更改了很多 then,这会使代码很难阅读(这称为 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; {.