我正在制作一个不和谐的机器人,对此我有点陌生。我总是遇到这两个错误,一个是在我修复另一个错误之后。我认为这可能与 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 代码包含
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期望什么。
options
的send
参数可以是WebhookMessageCreateOptions类型。
WebhookMessageCreateOptions
扩展了 Omit<MessageCreateOptions, 'nonce' | 'reply' | 'stickers'>
,即没有指定属性的 MessageCreateOptions
。
BaseMessageOptionsWithPoll
BaseMessageOptions
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>())
这些更改应该允许您无错误地编译项目。可能还有其他运行时问题,但它应该会让您走上正轨。