mysql - nodejs中的自定义mysql函数返回未定义
问题描述
所以我在 NodeJS 的文件中有一个多功能,它返回未定义,所以这是我的代码:`
var MySql = require('mysql');
var mysql = MySql.createConnection({
host: process.env.DB_IP,
user: process.env.DB_USER,
password: process.env.DB_PASS,
database: "gamezone_3tar"
});
mysql.connect(function(err){
if (err) throw err;
console.log('MySql Connection Successfully!');
});
module.exports = {
checkGuild: function(gid){
var sql = "SELECT * FROM GUILDS WHERE `gid` = '"+gid+"'";
mysql.query(sql, function (err, result) {
if (err) throw err;
return true;
});
},
addGuild: function(gid, gname, gowner){
var sql = "INSERT INTO GUILDS(`gid`, `gname`, `gOwner`) VALUES ('"+gid+"', '"+gname+"', '"+gowner+"')";
mysql.query(sql, function (err, result) {
if (err) throw err;
return true;
});
},
checkVip: function(type, id){
if(type == 'guild')
var sql = 'SELECT vip FROM GUILDS WHERE `gid` = ?';
else if(type == 'user')
var sql = 'SELECT vip FROM USERS WHERE `uid` = ?';
mysql.query(sql, [id], function(err, result){
if (err) throw err;
var tempdata = JSON.parse(result);
if(tempdata.vip == 'false')
return false;
else if(tempdata.vip == 'true')
return true;
});
},
addVip: function(type, id){
if(type == 'guild')
var sql = "UPDATE GUILDS SET vip = 'true' WHERE `gid` = '"+id+"'";
else if(type == 'user')
var sql = "UPDATE USERS SET vip = 'true' WHERE `uid` = '"+id+"'";
mysql.query(sql, function(err, result){
if (err) throw err;
return true;
});
},
removeVip: function(type, id){
if(type == 'guild')
var sql = "UPDATE GUILDS SET vip = 'false' WHERE `gid` = '"+id+"'";
else if(type == 'user')
var sql = "UPDATE USERS SET vip = 'false' WHERE `uid` = '"+id+"'";
mysql.query(sql, function(err, result){
if (err) throw err;
return true;
});
},
removeGuild: function(gid){
var sql = "DELETE FROM GUILDS WHERE `gid` = '"+gid+"'";
mysql.query(sql, function(err, result){
if (err) throw err;
return true;
});
}
};
这是我用来触发此功能的 discord bot 命令:
var db = require('../../etc/database.js');
module.exports = {
name: "addvip",
description: "change guild to vip",
execute(message) {
const msgID = message.author.id;
if (!admins.includes(msgID)) return;
if(db.checkGuild(message.guild.id) == true)
{
if(db.checkVip('guild', message.guild.id) == true)
{
console.log('already vip!');
}
else if(db.checkVip('guild', message.guild.id) == false)
{
if(db.addVip('guild', message.guild.id) == true)
{
console.log('Guild is now vip!');
}else{
console.log('error in addvip');
}
}else{
console.log('error in checkVip');
}
}
else if(!db.checkGuild(message.guild.id) == true)
{
if(db.addGuild(message.guild.id, message.guild.name, message.guild.owner) == true)
{
if(db.addVip('guild', message.guild.id) == true)
{
console.log('added to vip!');
}else console.log('error in adding [check]');
}else console.log(db.addGuild(message.guild.id, message.guild.name, message.guild.owner));
}else console.log('wtf!');
}
};
所以知道如何解决这个问题吗?在解决 SQL 错误和 ...
顺便说一句,它成功连接到 MySQL 服务器!
解决方案
这似乎是由于您的 SQL 代码使用回调,因此没有立即返回数据,因此返回值为undefined
. 要解决此问题,您需要使 SQL 函数返回 aPromise
并将return
语句更改为resolve()
,如下所示:
checkGuild: function(gid){
return new Promise(resolve => {
var sql = "SELECT * FROM GUILDS WHERE `gid` = '"+gid+"'";
mysql.query(sql, function (err, result) {
if (err) throw err;
resolve(true);
});
});
},
然后,您需要await
在调用函数的任何位置使用以等待Promise
完成。由于您正在调用addvip
命令文件中的函数,因此您需要使execute
函数异步,以便您可以使用await
:
module.exports = {
name: "addvip",
description: "change guild to vip",
async execute(message) {
const msgID = message.author.id;
if (!admins.includes(msgID)) return;
if(await db.checkGuild(message.guild.id) == true)
推荐阅读
- python - 求两条水平重叠曲线之间的积分
- python - 用条件填充缺失值
- html - 无法将消息提示到反应式表单中的必填字段
- python - 对大量文档进行重复数据删除 (Python)
- active-directory - 从 AD 用户和属性在数组中创建报表,并允许属性为空
- python - 基于 pca.explained_variance_ratio_ plot 的累积解释方差似乎太多
- python - 格式化不带小数的货币值
- google-cloud-platform - 从 Azure blob 复制到 GCP 存储桶 - 通过 Terraform
- javascript - 有没有办法调用嵌套在另一个函数中的函数?
- vue.js - Vue.js 组件删除同级标记。特征?