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中的自定义模块时,它将被定义为未定义
JQuery Post到NodeJS返回MySQL值给出未定义?