Я работаю над ботом с использованием 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;
}
});
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваша функция 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);
}
});
});
}
Ваша функция getPoints раньше ничего не возвращала. Возврат чего-либо в функцию db.query, как вы это делали, просто приведет к его игнорированию.
Это сработало отлично, спасибо! Вы можете объяснить, почему мне пришлось использовать обещание, чтобы исправить это? Какие были проблемы с моими старыми заявлениями о возврате?