“MessagedEmbed 字段值必须是非空字符串”和“无法读取未定义的属性(读取“链接”)错误消息

问题描述 投票:0回答:1

我正在制作一个不和谐的机器人,对此我有点陌生。我总是遇到这两个错误,一个是在我修复另一个错误之后。我认为这可能与 Typescript strict 有关。


"use strict";

Object.defineProperty(exports, "__esModule", { value: true });

const { MessageEmbed, WebhookClient, ButtonBuilder, ButtonStyle, ActionRowBuilder } = require('discord.js');

const { webhookId, webhookToken } = require('./webhook-config.json');


const webhookClient = new WebhookClient({ id: webhookId, token: webhookToken });



const http = require('http');



let host = 'http://localhost:3000';

require('dotenv').config();

let tiktokUsername = process.env.tiktokUsername;

let url_roominfo = host + '/roominfo?tiktokUsername=' + tiktokUsername;



let link = 'https://www.tiktok.com/' + tiktokUsername + '/live';



http.get(url_roominfo,(res) => {

    let body = "";



    res.on("data", (chunk) => {

        body += chunk;

    });



    res.on("end", () => {

        try {

            let json = JSON.parse(body);


            const embed = new MessageEmbed(

                {

                    color: 0x5AEDF2,

                    title: json.title,

                    url: link,

                    author: {

                        name: json.owner.nickname + ' is now live on Tiktok!',

                        icon_url: json.cover.url_list[0],

                        url: link,

                    },

                    fields: [

                        {

                            name: 'Game',

                            value: json.game_tag[0]['show_name'],

                            inline: true,

                        },

                        {

                            name: 'View',

                            value: json.user_count,

                            inline: true,

                        },

                    ],

                    

                }

            );

            const button = new ButtonBuilder(

                {

                    type: 2,

                    style: ButtonStyle.Link,

                    label: 'Watch Stream',

                    url: json.share_url,

                }

            );

            const row = new ActionRowBuilder()

                .addComponents(button)

            webhookClient.send({

                content: '@everyone ' + json.owner.nickname + ' is live now🔴',

                components: [row],

                embeds: [embed],

            });

        } catch (error) {

            console.error(error.message);

        };

    });



}).on("error", (error) => {

    console.error(error.message
);

我据说正在制作一个不和谐的机器人,一旦某个 tiktok 用户上线就会通知我。有什么建议我可以解决这个问题吗?

typescript discord discord.js
1个回答
0
投票

您的 TypeScript 代码包含

require
语句。这让我相信您正在编写一个
CommonJS
类型的节点应用程序。虽然这没有什么问题,但我强烈建议您编写 ESM 模块(ECMAScript 模块)。这是现代标准,如果您的项目仍处于创建阶段,则迁移起来并不费力。

在 package.json 中确保

"type": "module"
存在。

将机器人程序的

ts
cts
文件扩展名更改为
mts
。 删除
Object.defineProperty(exports, "__esModule", { value: true });
行 -> 它在 ESM 模块中是不必要的。 从代码中删除所有包含
require
的行。

在代码顶部,在

"use strict";
之后(这在技术上是不必要的,因为 ESM 模块默认情况下是严格的)放置

import { WebhookClient, ButtonBuilder, ButtonStyle, ActionRowBuilder } from 'discord.js';
import { APIEmbed } from 'discord-api-types/v10';

import { webhookId, webhookToken } from './webhook-config.json';

import http from 'http';

import dotenv from 'dotenv';
dotenv.config();

在 Typescript 中,不使用

require
并依赖文件顶部的
import
语句(在
"use strict"
之后)会让你受益匪浅,因为你可以从中获得更好的类型安全性。

  • 使用

    require
    未解决的导入不会导致错误,相反,它们只是
    undefined
    。这就是您的帖子标题中出现问题的原因之一。已解析的导入属于
    any
    类型,在获取有关您正在使用的内容(您的导入具有哪些属性)的信息时,这是没有用的。

  • 使用

    import
    语句,编译器会检查
    discord-js
    是否包含您想要导入的内容。这还允许您的编辑器警告您任何未解决的导入,这将阻止您使用
    undefined
    不存在的属性。

如您所见,“MessageEmbed 不存在于“discord-js”中。相反,现在有

APIEmbed
,来自 'discord-api-types',是 'discord.js' 的依赖项。如果您有 ' Discord.js' 安装后您已经安装了 'discord-api-types'。

你如何知道你需要什么

APIEmbed
:你可以通过向后阅读文档来弄清楚WebhookClient.send期望什么。

  1. options
    send
    参数可以是WebhookMessageCreateOptions类型。

  2. WebhookMessageCreateOptions
    扩展了
    Omit<MessageCreateOptions, 'nonce' | 'reply' | 'stickers'>
    ,即没有指定属性的
    MessageCreateOptions

  3. MessageCreateOptions扩展

    BaseMessageOptionsWithPoll

  4. BaseMessageOptionsWithPoll扩展

    BaseMessageOptions

  5. BaseMessageOptions 有一个属性

    embeds
    ,其类型为
    readonly (JSONEncodable<APIEmbed> | APIEmbed)[]
    。您主要对 APIEmbed 感兴趣,它是未由“discord-js”指定的接口,而是由其依赖项“discord-api-types”指定。

导入修复后,您可以将

MessageEmbed
替换为
APIEmbed
。由于
APIEmbed
是一个接口,它没有构造函数,因此您只能告诉 Typescript 创建一个符合
APIEmbed
的对象。同样类型安全,不同的语法。

更换

const embed = new MessageEmbed(

            {

const embed: APIEmbed = {

并在该定义的末尾替换

    }

);

};

定义内的所有字段保持不变。

还存在另一个问题:

ActionRowBuilder
是一个必须接收输入信息的通用类。这在此处的警告中得到了澄清。您已经导入了
ButtonBuilder
,您必须将其用作输入信息。

更换

const row = new ActionRowBuilder()

const row = (new ActionRowBuilder<ButtonBuilder>())

这些更改应该允许您无错误地编译项目。可能还有其他运行时问题,但它应该会让您走上正轨。

© www.soinside.com 2019 - 2024. All rights reserved.