Node.js - значение из функции возвращает undefined

Я работаю над ботом с использованием discord.js. Моя цель требует от меня использования SQL для хранения информации о пользователях и их точках. Когда я пытаюсь использовать команду! Points, я получаю правильный ответ от моей консоли. Однако оператор My! Points case возвращает неопределенное значение. После тестирования без оператора if я получаю следующее сообщение: имеет неопределенные точки.

bot.on("message", function(message) {
  if (message.author.equals(bot.user)) return;

  var command = message.content.split(" ")[0];
  var param = message.content.split(" ")[1];

  if (!VALID_CMDS.includes(command)) return;
  var GUILD = bot.guilds.values().next().value;
  switch (command) {
    case "!hello":
      if (param) {
        message.channel.send("Hello, " + param);
      } else {
        message.channel.send("Use a second parameter and try again. FORMAT: !hello <name_goes_here>");
      }
      break;
    case "!points":
      if (getPoints(param) > -1) {
        message.channel.send(param + " has " + points + " points");
      }
      break;
  }
});

function getPoints(username) {
  var GUILD = bot.guilds.values().next().value;

  var sql = "SELECT points, user_name FROM users WHERE user_name = " + "'" + username + "'";
  db.query(sql, function(err, result) {
    if (err) throw err;
    if (!resultEmpty(result)) { //The following console log outputs an actual numerical value for result[0].points (not undefined)
      console.info(result[0].user_name + " has " + result[0].points + " points");
      return result[0].points;
    } else {
      console.info("User with the name " + username.toString() + " not found")
      return -1;
    }
  });
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
1 113
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша функция getPoints в настоящий момент ничего не возвращает, поэтому по умолчанию используется undefined. Попросите его вернуть Promise, который вместо этого разрешает значение points, чтобы вы могли вызвать для него .then:

bot.on("message", function(message) {
  if (message.author.equals(bot.user)) return;

  var command = message.content.split(" ")[0];
  var param = message.content.split(" ")[1];

  if (!VALID_CMDS.includes(command)) return;
  var GUILD = bot.guilds.values().next().value;
  switch (command) {
    case "!hello":
      if (param) {
        message.channel.send("Hello, " + param);
      } else {
        message.channel.send("Use a second parameter and try again. FORMAT: !hello <name_goes_here>");
      }
      break;
    case "!points":
      getPoints(param)
        .then((points) => {
        if ( > -1) { //The return value of getPoints() is undefined
          message.channel.send(param + " has " + points + " points");
        }
      }
    break;
  }
});

function getPoints(username) {
  return new Promise((resolve, reject) => {
    var GUILD = bot.guilds.values().next().value;

    var sql = "SELECT points, user_name FROM users WHERE user_name = " + "'" + username + "'";
    db.query(sql, function(err, result) {
      if (err) return reject(err);
      if (!resultEmpty(result)) { //The following console log outputs an actual numerical value for result[0].points (not undefined)
        console.info(result[0].user_name + " has " + result[0].points + " points");
        resolve(result[0].points);
      } else {
        console.info("User with the name " + username.toString() + " not found")
        resolve(-1);
      }
    });
  });
}

Это сработало отлично, спасибо! Вы можете объяснить, почему мне пришлось использовать обещание, чтобы исправить это? Какие были проблемы с моими старыми заявлениями о возврате?

Justin Hernandez 10.06.2018 07:11

Ваша функция getPoints раньше ничего не возвращала. Возврат чего-либо в функцию db.query, как вы это делали, просто приведет к его игнорированию.

CertainPerformance 10.06.2018 07:17

Другие вопросы по теме