NodeJS Discord.js斜线命令生成器():从异步函数的列表中获取选项

bt1cpqcv  于 2023-01-20  发布在  Node.js
关注(0)|答案(2)|浏览(154)

我试图创建一个斜杠命令/test3,它带有一个选项input,这个选项有很多选择,但是我想从一个异步函数中获取这些选择,但是我尝试的方法不起作用。
下面是生成参数列表简化版本的代码,格式为tools.js

module.exports = {
    getArgumentList: () => getArgumentList()
}

async function getArgumentList(){
    return [
        {name: '1', value:'One'},
        {name: '2', value:'Two'},
        {name: '3', value:'Three'},
        {name: '4', value:'Four'},
        {name: '5', value:'Five'}
    ]
}

以及命令的代码(test3.js

const { SlashCommandBuilder } = require("discord.js");
const { getArgumentList } = require("../tools.js")

module.exports = {
    data: new SlashCommandBuilder()
            .setName('test3')
            .setDescription('Test command for commands with options.')
            .addStringOption(option =>
                getArgumentList()
                        .then(list => option.setName('input')
                                                .setDescription('The input to echo back.') 
                                                .setChoices(...list) )),           
    async execute(interaction){ 
        console.log('Testing')
    }
}

这里我得到这个错误:

ExpectedValidationError: Expected
    at InstanceValidator.handle 
    ...
    at Module._load (node:internal/modules/cjs/loader:922:12) {
  validator: 's.instance(V)',
  given: Promise { <pending> },
  expected: [Function: SlashCommandStringOption]
}

Node.js v18.13.0

有什么好的办法吗?

uurity8g

uurity8g1#

.then()函数总是返回一个promise,所以你不能把它设置为.addStringOption()的返回值,使用async/await会使这一点变得更简洁和容易。

data: new SlashCommandBuilder()
            .setName('test3')
            .setDescription('Test command for commands with options.')
            .addStringOption(async option => {
               let list = await getArgumentList()
               return option.setName('input')
                   .setDescription('The input to echo back.')
                   .setChoices(...list)
            })
hmmo2u0o

hmmo2u0o2#

重构你的命令系统,让data成为一个函数,然后在你的slash命令部署脚本中(或者你之前使用data属性的地方)等待它,这样你就可以把data修改成这样:

module.exports = {
    data: async () => {
        // The list is fetched here (where we can use promises and async-await) before the SlashCommandBuilder gets made.
        const list = await getArgumentList();
        return new SlashCommandBuilder()
            .setName("test3")
            .setDescription("Test command for commands with options.")
            .addStringOption((option) =>
                option
                    .setName("input")
                    .setDescription("The input to echo back.")
                    .setChoices(...list)
            );
    };
}

斜线命令部署脚本示例:

const commands = await Promise.all(
    client.commandRegistry.map((command) => (await command.data()).toJSON())
);

如果需要,您还可以将默认的SlashCommandBuilder传递给data函数:
一个二个一个一个

相关问题