首页 > 解决方案 > 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 服务器!

标签: mysqlnode.jsdiscord.js

解决方案


这似乎是由于您的 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)

推荐阅读