如何修复:“;来自fetch的未定义响应";Javascript
正在尝试从以下指南中打开的API获取链接/图像: 但它不起作用。我一直收到一个未定义的回复 已经尝试过创建异步函数等等,但没有更进一步。 它还被try-catch子句包围以进行调试,但没有找到答案如何修复:“;来自fetch的未定义响应";Javascript,javascript,api,asynchronous,fetch,Javascript,Api,Asynchronous,Fetch,正在尝试从以下指南中打开的API获取链接/图像: 但它不起作用。我一直收到一个未定义的回复 已经尝试过创建异步函数等等,但没有更进一步。 它还被try-catch子句包围以进行调试,但没有找到答案 module.exports = { name: 'poes', description: 'Laat een random poes foto zien', async execute(message, args) {
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!');
}
}
);
遵循指南的预期结果应该是随机的cat图像。您使用的文档在以下几个方面不正确:
const {body} = await fetch('https://aws.random.cat/meow').then(response => response.json())
fetch
没有失败(例如404)。这是我经常犯的错误fetch
的承诺仅拒绝网络错误,而不是HTTP错误。您必须检查response.ok
或response.status
主体
属性异步
函数中使用然后
,这没有什么意义https://aws.random.cat/meow
,我得到了这个JSON:
{"file":"https:\/\/purr.objects-us-east-1.dream.io\/i\/img_20131111_094048.jpg"}
那里没有body
,这就是为什么你会得到未定义的
下面是一个修复所有三个问题的示例:
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
您使用的文档在以下几个方面不正确:
const {body} = await fetch('https://aws.random.cat/meow').then(response => response.json())
该行假设fetch
没有失败(例如404)。这是我经常犯的错误fetch
的承诺仅拒绝网络错误,而不是HTTP错误。您必须检查response.ok
或response.status
解析的结果将具有主体
属性
它在异步
函数中使用然后
,这没有什么意义
但是如果我去https://aws.random.cat/meow
,我得到了这个JSON:
{"file":"https:\/\/purr.objects-us-east-1.dream.io\/i\/img_20131111_094048.jpg"}
那里没有body
,这就是为什么你会得到未定义的
下面是一个修复所有三个问题的示例:
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
来自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)
来自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)
您的json中有正文吗?您是对的,它没有“正文”。您的json中有正文吗?您是对的,它没有“正文”。感谢您的回复,我将在几分钟后尝试!感谢您的回复,我将在几分钟内尝试!谢谢你的回复,我会在一分钟内尝试,让你知道!非常感谢这一切成功了!不过我还有一个问题:“这个函数还需要异步吗?@Darcula-如果你要使用await
,是的,因为await
只在async
函数中有效。在非async
函数中,另一种方法是返回fetch>函数的结果。”https://aws.random.cat/meow)。然后呢(response=>{if(!response.ok){throw new Error(“HTTP status”+response.status);}return response.json();})
(这是json的承诺)。我使用了您提供的答案!错误地单击了另一个答案。这意味着所有问题都解决了?(将阅读您提供的链接!)@Darcula应该是这样的,是的!:-)感谢您的回复,我将在一分钟内尝试并让您知道!非常感谢这项工作!不过我还有一个问题:“函数是否仍然需要异步?”Darcula-如果您要使用await
,是的,因为await
仅在async
函数中有效。在非async
函数中,另一种方法是返回fetch()的结果https://aws.random.cat/meow然后(response=>{if(!response.ok){抛出新错误(“HTTP status”+response.status);}返回response.json();})代码>(这是JSON的承诺)。我使用了您提供的答案!错误地点击了另一个答案。这就意味着所有的问题都解决了,对吗?(将阅读您提供的链接!)@Darcula-应该是这个意思,是的!:-)