javascript - 无法在 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
现在这些是我尝试过的事情:
- 将 console.log(dbresult) 放在 foreach() 块内。它读取ID就好了!
- 使 dbresult 成为字符串(如您所见),而且我也尝试过不将其转换为字符串
- 只是因为我很绝望,我什至尝试了这个:channel.send(
${dbresult}
),以防万一。
有效的东西:
- 我想在这部分脚本之外触发的东西很好,脚本总是被成功激活。
- 该脚本始终读取频道的每一个 id。通过删除“foreach”函数的内部并放置一个console.log(dbresult),我看到它输出了我希望它输出的不同ID。
这是整个脚本:
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();
})
当然,任何帮助都是值得的
解决方案
如果您使用的是 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 存储为字符串。(可能是更简单的解决方案)
推荐阅读
- java - 我的 FXML 的 JavaFX 确认框有什么问题?
- metal - device.makeCommandQueue() 给出致命错误:在展开可选值时意外发现 nil
- wordpress - Wordpress Header 在代码修改后损坏
- javascript - 前端JS和http/认证管理的缺失
- docker - 如何使用 docker 编译 Arduino 程序?
- mysql - 将选择语句转换为更新(包括存在和拥有)
- python - 在带状图子图中为每个分布绘制多条水平线 Matplotlib
- javascript - nuxt.js 在 netlify 中生成带有动态路由的静态站点
- angular - NG子组件不调用服务
- java - Java 异常模式