【问题标题】:Discord.js delete functionDiscord.js 删除功能
【发布时间】:2020-08-07 07:29:30
【问题描述】:

我的问题是我在尝试删除 Discord 中的消息时收到错误消息。

client.on('message', msg => {

    if(msg.content.startsWith(".del ")) {

      msg.delete(1000); //Supposed to delete message

    }
});

我收到此错误:

C:\Users\---\Desktop\Test\node_modules\discord.js\src\structures\Message.js:501
    if (typeof options !== 'object') throw new TypeError('INVALID_TYPE', 'options', 'object', true);
                                     ^

TypeError [INVALID_TYPE]: Supplied options is not an object.
    at Message.delete (C:\Users\---\Desktop\Test\node_modules\discord.js\src\structures\Message.js:501:44)
    at Client.<anonymous> (C:\Users\---\Desktop\Test\index.js:51:17)
    at Client.emit (events.js:310:20)
    at MessageCreateAction.handle (C:\Users\---\Desktop\Test\node_modules\discord.js\src\client\actions\MessageCreate.js:31:14)
    at Object.module.exports [as MESSAGE_CREATE] (C:\Users\---\Desktop\Test\node_modules\discord.js\src\client\websocket\handlers\MESSAGE_CREATE.js:4:32)
    at WebSocketManager.handlePacket (C:\Users\---\Desktop\Test\node_modules\discord.js\src\client\websocket\WebSocketManager.js:386:31)
    at WebSocketShard.onPacket (C:\Users\---\Desktop\Test\node_modules\discord.js\src\client\websocket\WebSocketShard.js:436:22)
    at WebSocketShard.onMessage (C:\Users\---\Desktop\Test\node_modules\discord.js\src\client\websocket\WebSocketShard.js:293:10)
    at WebSocket.onMessage (C:\Users\---\Desktop\Test\node_modules\ws\lib\event-target.js:120:16)
    at WebSocket.emit (events.js:310:20) {
  [Symbol(code)]: 'INVALID_TYPE'
}

我也尝试过message.delete(1000),但我收到一条错误消息,告诉我消息未定义。

当我删除试图删除消息的代码时,程序运行。

【问题讨论】:

  • 您可以编辑您的问题以添加确切的错误消息吗?当您尝试删除它时,您确定该消息存在吗?也许之前有其他东西删除了这条消息,比如你的机器人的另一个实例。
  • 无需删除您的问题。我给了一个答案,你还可以等待更多。我不是这里唯一的一个;)

标签: javascript discord.js


【解决方案1】:

正如错误消息所说,您需要将任何内容或对象传递给 delete 方法。


Discord.js V13 新版本

对于 Discord.js@13 及更高版本,message.delete() 方法不再接受选项。您现在需要像这样使用setTimeout

The Message.delete() method no longer accepts any options, requiring a timed-delete to be performed manually.

setTimeout(() => msg.delete(), 1000);

对于 Discord.js V12 及更早版本

你可以查一下in the documentation。您正在尝试做的事情是这样的:

client.on('message', msg => {
  if(msg.content.startsWith(".del ")) {

    msg.delete({timeout: 1000}); //Supposed to delete message

  }
});

【讨论】:

  • 如何处理错误,以防在代码运行之前消息已被删除?假设 5 秒超时,这是一个合理的场景
  • @FederickJonathan 我想你只需要用一个简单的.catch(console.log) 来捕捉承诺,或者如果你想避免任何异常,只需一个无操作回调。
  • 捕获解决方案不知何故不起作用。我的代码看起来像这样message.delete().catch(reason =&gt; {console.log('reason:', reason)}),错误被捕获并在控制台中打印出来,但机器人仍然崩溃。关于无操作回调,那是什么?你能解释更多吗?
  • @FederickJonathan 如果删除被捕获,它不应该崩溃。您应该使用代码和错误消息创建自己的问题。至于no-op函数,它只是一个没有操作的函数,所以通常是一个空函数() =&gt; {}
【解决方案2】:

通过将 msg.delete(3000) 删除为 msg.delete({ timeout: 3000 }) 来更改您的代码,这应该可以修复错误,因为它在 discord.js v12 中已更改。

您可以比较文档 - https://www.npmjs.com/package/discord.js-v11
您可以比较文档 - https://discord.js.org/#/

【讨论】:

    【解决方案3】:

    你可以通过两种方法做到这一点

    1. 设置超时方法

      setTimeout(() => {
          msg.delete()
      }, 1000 // <- change this according to your requirement in miliseconds)
      
    2. 您可以在命令的参数中添加超时

      只是代替

      msg.delete(3000);

      msg.delete({ timeout: 1000});

    3. 要进行批量删除,您可以这样做

      setTimeout(() => {
          message.channel.bulkDelete(var)
      }, 1000 // <- change this according to your requirement in miliseconds)
      

      这可以帮助您删除最多 100 条消息。

    您可以在此处比较文档 - Discord.js v11Discord.js v12

    【讨论】:

      【解决方案4】:

      如果您想在延迟后删除消息:

      setTimeout(function() {
        msg.delete();
      }, 1000) // Time in miliseconds, 1s = 1000ms
      

      如果你想删除它,请使用:

      msg.delete();
      

      简单代码(1秒后删除命令信息):

      client.on('message', msg => {
          if(msg.content.startsWith(".del ")) {
            setTimeout(function() {
                msg.delete();
            }, 1000)
          }
      });
      

      错误 message is not defined 显示您,因为您在 client.on('message', msg.. 定义了 msg

      【讨论】:

        【解决方案5】:

        注意:delete()方法/函数的超时参数将在v13 djs中被弃用(文档中没有提到)。所以你可以使用setTimeout()函数延迟。

        setTimeout(function(){
          msg.delete()
        },3000)
        

        【讨论】:

          【解决方案6】:

          如果您想延迟删除消息:

          setTimeout(function(){
            msg.delete()
          }, 1000) // this is the number of miliseconds for the delay
          

          如果你想马上删除它,

          msg.delete()
          

          【讨论】:

            【解决方案7】:

            您几乎正确,我可以看到您使用 v12,因此功能已更改,因此您可以纠正错误的第一件事是将 msg.delete(3000) 更改为 msg.delete({ timeout: 3000 }),这应该可以解决您可以看到 v11 不使用的错误要求您这样做,但 v12 无论如何我认为我已经解决了这里的问题,请将其标记为已回答。如果您将 Discord.JS 机器人公开,然后将配置添加到机器人中并制作命令文件,我有一个建议,这样您就不必制作一个大的凌乱文件并使用像 if(!message.content.includes("**prefixhere**") return; 这样的前缀语句会忽略所有消息没有前缀,然后您需要将消息拆分为 ["prefix", "cmd", "args"] 应该可以正常工作。谢谢你让我帮你。

            【讨论】:

              【解决方案8】:

              如果您尝试添加延迟,之前的回复提供了许多示例。如果您尝试删除一定数量的消息,您需要使用message.channel.bulkDelete(varName)。删除大量消息的方法是批量删除,我也会提到,一次只能删除 1-100 条消息。

              【讨论】:

                【解决方案9】:

                使用这个在超时删除msg(以ms计算):

                msg.delete({ timeout: 1000});
                

                或者通过这个立即删除:

                msg.delete();
                

                【讨论】:

                  猜你喜欢
                  • 2019-11-07
                  • 2012-12-23
                  • 1970-01-01
                  • 2023-04-01
                  • 2021-07-31
                  • 2017-07-31
                  • 2020-08-24
                  • 2023-03-08
                  • 2017-03-18
                  相关资源
                  最近更新 更多