首页 > 解决方案 > 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);

标签: javascriptdiscorddiscord.js

解决方案


与其按照@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);
});

推荐阅读