错误:在 Discord Bot 的命令处理程序上找不到模块

Posted

技术标签:

【中文标题】错误:在 Discord Bot 的命令处理程序上找不到模块【英文标题】:Error: Module Not Found on Discord Bot's Command Handler 【发布时间】:2022-01-14 21:00:00 【问题描述】:

首先,我对此很陌生。我一直在关注Discord.js Site 上的教程,目标是为我所在的 Play by Post DnD 服务器制作一个不和谐的机器人,每个人都想通过字数来获得经验。

我提到我是新手,因为这是我第一次亲身体验 javascript,很多术语都在我脑海中浮现。

所以,问题似乎出在我脱离教程的地方。它涵盖了命令处理程序,我想坚持使用它,因为它似乎是一种很好的做法,并且在大多数情况下更容易使用(而且我知道它会)。但是数据库教程(货币/Sequelizer)并没有真正触及“维护引用”之外的命令处理程序。

前言已经足够了,问题在于尝试获取一个命令来检查数据库中玩家当前的经验值和等级。

我将看似相关的文件与 index.js 和 dbObjects.js 组织在一起,一个模型文件夹供用户使用,LevelUp(教程中的 CurrencyShop)和一个单独的文件夹用于命令,例如有问题的命令 xpcheck。 js

我可以在不中断的情况下让命令运行,使用以下命令,

const  Client, Collection, Formatters, Intents  = require('discord.js');
const  SlashCommandBuilder  = require('@discordjs/builders');
const experience = new  Collection();
const level = new Collection();

Reflect.defineProperty(experience, 'getBalance', 
    /* eslint-disable-next-line func-name-matching */
    value: function getBalance(id) 
        const user = experience.get(id);
        return user ? user.balance : 0;
    ,
);

Reflect.defineProperty(level, 'getBalance', 
    /* eslint-disable-next-line func-name-matching */
    value: function getBalance(id) 
        const user = level.get(id);
        return user ? user.balance : 1;
    ,
);

module.exports = 
    data: new SlashCommandBuilder()
        .setName('xpcheck')
        .setDescription('Your current Experience and Level'),
    async execute(interaction) 
        const target = interaction.options.getUser('user') ?? interaction.user;

        return interaction.reply(`$target.tag is level $level.getBalance(target.id) and has $experience.getBalance(target.id) experience.`);;
    ,
;

问题是该命令没有引用数据库。它每次都返回默认值(1st level,0 exp)。

我尝试获取引用数据库的命令,这是众多尝试之一;

const  Client, Collection, Formatters, Intents  = require('discord.js');
const  SlashCommandBuilder  = require('@discordjs/builders');
const Sequelize = require('sequelize');
const  Users, LevelUp  = require('./DiscordBot/dbObjects.js');


module.exports = 
    data: new SlashCommandBuilder()
        .setName('xpcheck')
        .setDescription('Your current Experience and Level'),
    async execute(interaction) 
        const experience = new  Collection();
        const level = new Collection();
        const target = interaction.options.getUser('user') ?? interaction.user;

        return interaction.reply(`$target.tag is level $level.getBalance(target.id) and has $experience.getBalance(target.id) experience.`);;
    ,
;

但是,当我运行 node deploy-commands.js 时,它会抛出

错误:找不到模块'./DiscordBot/dbObjects.js'

即使我删除了/DiscordBot,或者我尝试为它创建一个常量的任何其他方式,它也会做同样的事情。我真的不确定我应该做些什么来缓解这个问题。

我的文件结构,供参考,是:

v DiscordBot

  v commands
     xpcheck.js

  v models
     LevelUp.js
     UserItems.js
     Users.js

  dbInit.js
  dbObjects.js
  deploy-commands.js
  index.js

【问题讨论】:

作为说明,我相当肯定问题在于 dbObjects.js 不是“落后”(我不确定正确的术语)Commands 文件夹,但我不知道我能做什么去做吧。 您试图要求一个不在该文件夹中的文件/需要一个不存在的文件夹,您能否使用您的文件结构(例如您的文件的格式)编辑问题,很可能您使用的是错误的路径(也许检查 DiscordBot/dbObjects.js 是否是你需要的,也许你试图做 ./dbObjects.js 因为不需要根文件) 我知道它不在那个特定文件夹中,它在它的上方/之前,但我不知道我是否可以将它放在命令文件夹或子文件夹中并且仍然让它做它需要的与代码的其他位有关。另外,文件结构现在在帖子中^-^ 从您的代码中我知道您试图从 xpcheck.js 命令/文件中要求“dbObjects.js”。所以你我上面说的在你不需要引用基本路径(例如:DiscordBot)的路径中是正确的(只需要一点修复)你想要的路径是:“../dbObjects.js”,因为文件是在 root / base 目录中,您需要从“command”文件夹中的 xpcheck.js 中获取它 所以- '..' 是关键吗? 【参考方案1】:

正如 cmets 中所指出的,问题很简单,解决方案也更简单。

纠正

const  Users, LevelUp  = require('./dbObjects.js');

const  Users, LevelUp  = require('../dbObjects.js');

允许它在主目录中搜索所需文件。

【讨论】:

以上是关于错误:在 Discord Bot 的命令处理程序上找不到模块的主要内容,如果未能解决你的问题,请参考以下文章

使用 Codeforces API 通过 discord bot (discord.py) 获取有关用户在 CF 问题上的所有 AC 的信息 - python 中的 json 文件处理错误

Discord bot 发送消息特定通道错误

在 Heroku 上部署 node.js 应用程序(discord.jd bot)导致错误

部署时heroku Push错误上的Discord bot

Discord Python代码中的命令未找到错误

Python discord bot“找不到命令'ban'”错误