开发者问题收集

TypeError:无法读取未定义的属性(读取‘长度’)unhandledRejection

2023-02-17
2449

当我在销售机器人中使用股票命令时,我收到此信息: TypeError:无法读取未定义(读取“长度”)unhandledRejection 的属性

我的代码

const Discord = require("discord.js")
const db = require("quick.db")
const config = require("../config.json")
module.exports = {
    
    name: "stock", // Coloque o nome do comando do arquivo
    run: async(client, message, args) => {
        message.delete()
        const embederro = new Discord.MessageEmbed()
        .setTitle(`Erro - Permissão`)
        .setDescription(`Você não tem permissão para isto!`)
        .setColor(config.cor)
        .setFooter({text:`${config.nomebot} - Todos os direitos reservados.`})
        if (!message.member.permissions.has("ADMINISTRATOR")) return message.channel.send({ embeds: [embederro] }).then(msg => {
                    setTimeout(() => msg.delete(), 5000)
                })
                const embednprod = new Discord.MessageEmbed()
                .setTitle("Erro - Sistema de Estoque")
                .setDescription("Você não tem nenhum produto adicionado, utilize \`[add]\` para criar o produto!")
                .setColor(config.cor)
        if(db.all().length == 0) return message.channel.send({embeds: [embednprod]}).then(msg => {
            setTimeout(() => msg.delete(), 10000)
        })
const itens = db.all().map(item => `ID: ${item.ID} | QUANTIDADE: ${item.data.conta.length || "0"}`)
const embed = new Discord.MessageEmbed()
.setTitle("Estoque")
.setDescription(`\`\`\`${itens.join("\n\n")}\`\`\``)
.setColor(config.cor)
message.channel.send({embeds: [embed]}).then(msg => {
    setTimeout(() => msg.delete(), 10000)
})

    }
}
2个回答

我之前多次在我的代码中收到此错误消息 TypeError:无法读取未定义的属性(读取'length') ,这通常意味着您正在尝试从内存中尚不存在的对象访问数据。

在您发布的代码中,导致错误的行可能是:

const itens = db.all().map(item => `ID: ${item.ID} | QUANTIDADE: ${item.data.conta.length || "0"}`)

因为您在输出数据之前没有正确检查它是否存在。我看到您为此使用了逻辑或,但有时它不能按预期正常工作。

要解决此问题,请用三元运算符替换检查,以查看在访问其属性之前是否定义了 item.data 。您可以将这一行修改为类似以下内容:

const itens = db.all().map(item => `ID: ${item.ID} | QUANTIDADE: ${item.data && item.data.conta ? item.data.conta.length : "0"}`)

这将检查 item.data 是否存在,以及在访问其 length 之前是否具有 conta 属性。如果这两个属性中的任何一个被解析为 undefined ,则它将默认为 “0”

Joe
2023-02-17

首先,您必须使用 === 运算符,以便它也能匹配值并检查类型。

尝试替换 if 条件,如下所示:

if(db.all().length == 0 || undefined) return message.channel.send({embeds: [embednprod]}).then(msg => {
            setTimeout(() => msg.delete(), 10000)
        })
Satish Birhade
2023-02-17