javascript - Discord JS 类别和返回 ID
问题描述
我正在尝试检查(并创建,如果它不存在)检查过程工作正常。
这是我的代码的副本:
var bb_admin='0';
//Check if admin_logs exists if not create it
if(message.guild.channels.cache.find(channel => channel.name === "admin_logs") === undefined && typeof message.guild.channels.cache.find(channel => channel.name === "admin_logs") == 'undefined')
{
console.log("creating");
bb_admin = message.guild.channels.create('admin_logs', {parent: bb_cat});
} else {
console.log("already exists");
bb_admin = message.guild.channels.cache.find(channel => channel.name === "admin_logs");}
console.log('bb_admin after',bb_admin);
我遇到的问题是我需要能够在创建变量之前将通道 ID 分配给变量,然后再继续。
我不能使用 .then 语句,因为接下来的步骤必须在此之外发生。(我正在循环一个日志文件并根据内容将该行填充到一个通道中)。
似乎正在发生的事情是我得到了一个承诺,但是当我改变这一行时: bb_admin = message.guild.channels.create('admin_logs', {parent: bb_cat}) 到: bb_admin = await message.guild。 channels.create('admin_logs', {parent: bb_cat})
等待响应我收到以下错误消息: SyntaxError: await 仅在异步函数和模块的顶层主体中有效
我已经看到了这个问题,这似乎与我想要实现的目标几乎相同。但即使运行尝试 2 也出现错误:TypeError: Cannot read property 'create' of undefined
任何我在这里出错的指针,我已经转了几天了。
编辑:非常基本的例子:
/**
* @file app.js
* @description BeerBot
* @author Beer
* @version 0.0.1
*/
// Require all needed packages and files
const { Client, MessageEmbed } = require('discord.js');
const config = require('./config.json');
const client = new Client();
// Ready event
client.on('ready', () => {
// Log when bot is ready
console.log(`${client.user.tag} is online!`);
});
// Message event
client.on('message', message => {
if (message.author.bot || !message.guild) return;
if (!message.content.startsWith("!")) return;
//Try a simple category created command
var bb_cat = message.guild.channels.cache.find(channel => channel.name === "BeerBot");
var bb_admin = 0;
//Check if admin_logs exists if not create it
if(message.guild.channels.cache.find(channel => channel.name === "admin_logs") === undefined && typeof message.guild.channels.cache.find(channel => channel.name === "admin_logs") == 'undefined')
{
//Try and create channel
console.log("creating");
bb_admin = message.guild.channels.create('admin_logs', {parent: bb_cat});
//End try and create channel
} else {
console.log("already exists");
bb_admin = await message.guild.channels.cache.find(channel => channel.name === "admin_logs");
}
//This always returns a promise
console.log('bb_admin after',bb_admin);
});
// Login into your bot with the bot token
client.login(config.client.token);
解决方案
与其按照@Viriato 的建议创建异步 IIFE,不如将当前回调转换为异步函数,如下面的示例所示。
此外,如果你调用message.guild.channels.cache.find()
了 3 次,你应该使用一个变量 :) 而且你不需要检查find()
方法是否返回undefined
或检查它的 typeof
. 您可以简单地检查返回的值是否真实。
// make the callback function async
client.on('message', async (message) => {
if (message.author.bot || !message.guild) return;
if (!message.content.startsWith('!')) return;
let adminLogsChannel = message.guild.channels.cache.find(
(channel) => channel.name === 'admin_logs',
);
// if admin_logs does not exist, create it
if (!adminLogsChannel) {
let parent = message.guild.channels.cache.find(
(channel) => channel.name === 'BeerBot',
);
adminLogsChannel = await message.guild.channels.create('admin_logs', { parent });
}
// this returns a GuildChannel now
console.log('adminLogsChannel after', adminLogsChannel);
});
推荐阅读
- python - 有没有办法在红移中使用 CONCAT(table_name(col1, col2, col3,.....)) 连接可变数量的列?
- javascript - 无法访问我未定义的 JSON 值
- sql - NotesSQL 到 Notes 9 ODBC 连接导致 IM005(0)[Microsoft][ODBC Driver Manager] Driver's SQLAllocHandle on SQL_HANDLE_DBC failed
- php - 如何升级 symfony 次要版本(4.1 到 4.2)
- azure-ad-b2c - Azure AD B2C 审核跟踪 - 客户端 ID
- ionic-framework - 为离子切换添加边框
- python - 使用随机函数后如何选择特定元素?
- ios - 使用 cocoapods 的子规范构建 ios 框架的问题
- c# - 突出显示具有相同文本的所有文本块
- javascript - 为什么 .getMonth() 在一月份返回 11?