开发者问题收集

如何修复:“未定义来自 fetch 的响应” Javascript

2019-04-22
2241

一直尝试从以下指南中的开放 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!');
            }

        }
    );

按照指南的预期结果应该是随机的猫图像。

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)
epascarello
2019-04-22

您使用的文档在几个方面是不正确的:

const {body} = await fetch('https://aws.random.cat/meow').then(response => response.json())
  1. 该行假设 fetch 不会失败(例如出现 404)。这是一个非常常见的错误,我 在我的贫血小博客上写了它 fetch 的承诺只会在 网络错误 时拒绝,而不会在 HTTP 错误时拒绝。您必须检查 response.okresponse.status

  2. 解析结果将具有 body 属性。

  3. 它在 async 函数中使用 then ,这没有什么意义。

但如果我转到 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
T.J. Crowder
2019-04-22