根据以下指南,尝试从开放的API中获取链接/图像:https://discordjs.guide/additional-info/rest-api.html#using-node-fetch 但它不起作用。我一直收到不确定的答复。
已经尝试制作异步函数等等,但是没有更进一步。 还用try-catch子句将其包围,以进行调试但找不到答案。
module.exports = {
name: 'poes',
description: 'Laat een random poes foto zien',
async execute(message, args) {
const fetch = require('node-fetch');
const {body} = await fetch('https://aws.random.cat/meow').then(response => response.json());
message.channel.send(body.file);
},
};
这是使用它的地方:
client.on('message', message => {
if (!message.content.startsWith(prefix) || message.author.bot) return;
const args = message.content.slice(prefix.length).split(/ +/);
const command = args.shift().toLowerCase();
if (!client.commands.has(command)) return;
try {
client.commands.get(command).execute(message, args);
} catch (error) {
console.error(error);
message.reply('there was an error trying to execute that command!');
}
}
);
遵循《指南》的预期结果应该是随机的猫图片。
答案 0 :(得分:2)
您使用的文档在两种方面是错误的:
const {body} = await fetch('https://aws.random.cat/meow').then(response => response.json())
该行假定fetch
不会失败(例如404)。这是一个非常常见的错误,以至于我written it up on my anemic little blog。 fetch
的承诺仅拒绝网络错误,而不拒绝HTTP错误。您必须检查response.ok
或response.status
。
已解析的结果将具有body
属性。
它在then
函数中使用async
,这毫无意义。
但是,如果我转到https://aws.random.cat/meow
,则会收到以下JSON:
{"file":"https:\/\/purr.objects-us-east-1.dream.io\/i\/img_20131111_094048.jpg"}
那里没有body
,这就是为什么您得到undefined
的原因。
下面是解决所有三个问题的示例:
const response = await fetch('https://aws.random.cat/meow');
if (!response.ok) {
throw new Error("HTTP status " + response.status);
}
const body = await response.json();
// ^---^---- no { and }, we don't want to destructure
答案 1 :(得分:2)
api的响应是
{
"file": "https://purr.objects-us-east-1.dream.io/i/r958B.jpg"
}
你说的是
{
"body" : {
"file" : ""
}
}
所以您需要丢弃括号
const body = await fetch('https://aws.random.cat/meow')
.then(response => response.json());
或者您需要查找文件
const { file } = await fetch('https://aws.random.cat/meow')
.then(response => response.json());
console.log(file)