首页 > 解决方案 > 无法在 discord.js 上的 channels.get() 内放置变量

问题描述

我一直在尝试解决这个问题,但这让我发疯。在我看来,它应该可以正常工作,但它出了点问题......我希望我不只是真的很累并且错过了一个非常容易的错误。

无论如何,事情就是这样。这很容易做到。一个事件被激活,然后下面的算法应该读取某个数据库,我在其中存储了我想要发送到的频道的 ID,并且它为每个 ID 执行一个循环,在每个循环上输出不同的 ID,

(注意:我不是在 client.on("message) 事件中这样做)

let channel = client.channels.get(dbresult)
channel.send(`test`);

这部分应该在 dbresult 变量上使用 2 个单独的数字运行 2 次(因为我在数据库中只有 2 个数字)。

现在,当我仅使用 id 号而不是像这样的 dbresult 变量运行此部分时:

rows.forEach(function(row){
      //let dbresult = row.newsid.toString()
     let channel = client.channels.get(`0123456789`)
     channel.send(`test`);
   })

该脚本工作得很好,但是当我使用 dbresult 变量时,它给了我这个错误

channel.send(`test`);
             ^

TypeError: Cannot read property 'send' of undefined

现在这些是我尝试过的事情:

有效的东西:

这是整个脚本:

  let db = new sqlite.Database('./databases/Serverinfo', sqlite.OPEN_READWRITE | sqlite.OPEN_CREATE);
  const sql = 'SELECT newsid FROM news';
  db.all(sql, function(error,rows){
    if (rows.length <= 0){
      return;
    }
    if (error){
      throw error;
    }
    rows.forEach(function(row){
      let dbresult = row.newsid.toString()
      console.log(dbresult)
     let channel = client.channels.get(dbresult)
     channel.send(`test`);
   })
   db.close();
  })

当然,任何帮助都是值得的

标签: javascriptnode.jsdiscorddiscord.js

解决方案


如果您使用的是 discord.js v.12,则需要使用该cache集合。

是的,您要使用的 id 必须是一个字符串。

let channel = client.channels.cache.get(dbresult);

https://discord.js.org/#/docs/main/stable/class/ChannelManager

您可能会考虑做的是在尝试发送内容之前检查是否找到了频道。

编辑:更新后的问题来自您将 channelID 作为 INT 存储在数据库中的事实,这会带来以下问题:Numeric literals with absolute values equal to 2^53 or greater are too large to be represented accurately as integers.

这意味着它无法正确存储 ID,因为它太大了,我们在这里讨论的是 Quadrillions。这可能发生在您的数据库中或当您将数字导入代码时。在不知道您的数据库设置的情况下,我无法判断。

例子:

683328323304292410 // the actual ID of the channel

683328323304292400 // the INT that is stored

要解决此问题,您有两个选项,并且都需要在您的数据库中实现。

  • 您可以转换存储 channelID 的行的数据类型,也可以bigINT在导入 ID源时转换它

  • 您可以首先将 channelID 存储为字符串。(可能是更简单的解决方案)


推荐阅读