Zoef
Zoef

Reputation: 403

node-fetch in discord.js cannot read property

I have been following the REST API guide from Discord.js, but I keep getting errors that the first property of the returning json cannot be read. I know that the api address is correct.

This is what the response looks like: response

And here is my code:

index.js

const Discord = require('discord.js');
const fetch = require('node-fetch');
const querystring = require('querystring');

const { prefix, token, api } = require('./config.json');

const client = new Discord.Client();

const trim = (str, max) => (str.length > max ? `${str.slice(0, max - 3)}...` : str);

client.once('ready', () => {
    console.log('Ready!');
});

client.on('message', async message => {
    if (!message.content.startsWith(prefix) || message.author.bot) return;

    const args = message.content.slice(prefix.length).split(/ +/);
    const command = args.shift().toLowerCase();

    if (command === 'div2') {
        if (!args.length) {
            return message.channel.send('You need to supply a search term!');
        }

        const query = querystring.stringify({ name: args.join(' ') });

        const { body } = await fetch(`${api}search.php?${query}&platform=uplay`)
            .then(response => response.json());         

        if (!body.results.length) {
            return message.channel.send(`No results found for **${args.join(' ')}**.`);
        }

        const [answer] = body.results;

        const embed = new Discord.RichEmbed()
            .setColor('#EFFF00')
            .setTitle(answer.name)
            .addField('Platform', trim(answer.platform, 1024))
            .addField('Kills PvE', trim(answer.kills_npc, 1024));


        message.channel.send(embed);
    }
});

Upvotes: 1

Views: 3489

Answers (1)

1565986223
1565986223

Reputation: 6718

Your response json image does not have body property. So when do the destructuring assignment, there's no corresponding body in the response to assign to. So body is undefined.

Change your destructuring to:

const { results } = await fetch(`${api}search.php?${query}&platform=uplay`)
  .then(response => response.json());
// results is array from the response

Or simply; don't destructure (and you can leave the rest of the code as it is):

const body = await fetch(`${api}search.php?${query}&platform=uplay`)
  .then(response => response.json());

Upvotes: 1

Related Questions