Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修复:“;来自fetch的未定义响应";Javascript_Javascript_Api_Asynchronous_Fetch - Fatal编程技术网

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

如何修复:“;来自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) {

正在尝试从以下指南中打开的API获取链接/图像: 但它不起作用。我一直收到一个未定义的回复

已经尝试过创建异步函数等等,但没有更进一步。 它还被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!');
            }

        }
    );


遵循指南的预期结果应该是随机的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-应该是这个意思,是的!:-)