nodejs中的自定义mysql函数返回未定义

Posted

技术标签:

【中文标题】nodejs中的自定义mysql函数返回未定义【英文标题】:custom mysql function in nodejs returns undefined 【发布时间】:2020-11-28 21:34:54 【问题描述】:

所以我在 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 错误和 ...

后,我正在认真处理此代码,例如 1 个月

顺便说一句,它成功连接到 MySQL 服务器!

【问题讨论】:

【参考方案1】:

这似乎是由于你的SQL代码使用了回调,所以没有立即返回数据,因此返回值为undefined。要解决此问题,您需要让 SQL 函数返回 Promise 并将 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)

【讨论】:

所以我得到了这个错误:` /app/node_modules/mysql/lib/protocol/Parser.js:437 throw err; // 重新抛出非 MySQL 错误 SyntaxError: Unexpected token o in JSON at position 1` @EhsanFox 该错误看起来像是您的 SQL 查询或您正在访问的文件有问题。您是否记得将我回答中的示例应用于您的代码的所有部分? 我都应用了,你能告诉我我的 sql 查询有什么问题吗?这是代码:mysql.query(sql, [id], function(err, result) if (err) throw err; var tempdata = JSON.parse(result); if(tempdata.vip == 'false') resolve(false); else if(tempdata.vip == 'true') resolve(true); ); @EhsanFox 你没有让它像我的回答那样返回Promise 我照你说的做了,未定义的想法消失了,取而代之的是,我收到了我发送的错误

以上是关于nodejs中的自定义mysql函数返回未定义的主要内容,如果未能解决你的问题,请参考以下文章

当尝试将变量传递给另一个模块时,将代码拆分到Nodejs中的自定义模块时,它将被定义为未定义

Nodejs 类返回未定义

JQuery Post到NodeJS返回MySQL值给出未定义?

Nodejs API调用将未定义返回给lambda函数

要求函数的返回数据变为未定义(Js,NodeJs,Discord.js)[重复]

node.js 中的 mySQL 查询返回未定义