получение 'Cannot read свойства' length 'undefined' при попытке извлечь из URL-адреса в node.js - PullRequest
0 голосов
/ 02 марта 2019

Итак, я пытался создать Discord-Bot, который мог бы искать определения в urbandictionary .. но я получаю ошибку после попытки извлечь json из их API.

const args = Array.prototype.slice.call(commandArgs);
    if (!args.length) {
    return message.channel.send('You need to supply a search term!');
    }

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

    const body  = await fetch(`https://api.urbandictionary.com/v0/define${query}`).then(response => response.json());

    console.log(fetch(`https://api.urbandictionary.com/v0/define${query}`).then(response => response.json()));

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

    const [answer] = body.list;

    const embed = new Discord.RichEmbed()
        .setColor('#EFFF00')
        .setTitle(answer.word)
        .setURL(answer.permalink)
        .addField('Definition', trim(answer.definition, 1024))
        .addField('Example', trim(answer.example, 1024))
        .addField('Rating', `${answer.thumbs_up} thumbs up. ${answer.thumbs_down} thumbs down.`);

    message.channel.send(embed);
    }

ошибкавыглядит следующим образом:

    (node:11948) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'length' of undefined
    at Client.client.on (C:\Users\Johannes\Desktop\Vladimir\main.js:176:18)
    at processTicksAndRejections (internal/process/next_tick.js:81:5)
(node:11948) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:11948) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

функция console.log () в середине просто говорит: "Promise {pending}"

1 Ответ

0 голосов
/ 02 марта 2019

Если мы никогда не сталкивались с трудными проблемами кодирования, мы, вероятно, недостаточно стараемся.И вместо того, чтобы сдаться, вы обратились за помощью.Будучи достаточно умным, чтобы делать все, что ставит вас в хорошее положение.

В вашем коде у вас есть команда await.Чтобы это работало, асинхронность должна быть помещена перед началом внешней функции.Имейте в виду, что ожидание работает только с обещаниями.Также обратите внимание, что у вас есть fetch один раз рядом с body, а затем снова в консоли.Это вызвало бы два запроса, когда нам нужен только один.Надеюсь, что обновленный фрагмент ниже поможет вам.

getUrbanDictionaryDefs = async function() {
  const args = Array.prototype.slice.call(commandArgs);
  if (!args.length) {
    return message.channel.send("You need to supply a search term!");
  }

  const query = querystring.stringify({ term: args.join(" ") });

  let body;

  try {
    body = await fetch(`https://api.urbandictionary.com/v0/define${query}`);
  } catch (err) {
    console.log(err);
    return;
  }

  body = body.json();

  console.log(body);

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

  const [answer] = body.list;

  const embed = new Discord.RichEmbed()
    .setColor("#EFFF00")
    .setTitle(answer.word)
    .setURL(answer.permalink)
    .addField("Definition", trim(answer.definition, 1024))
    .addField("Example", trim(answer.example, 1024))
    .addField(
      "Rating",
      `${answer.thumbs_up} thumbs up. ${answer.thumbs_down} thumbs down.`
    );

  message.channel.send(embed);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...