我正在为 Discord 制作一个机器人,这个机器人的功能之一是等级系统。我决定从使用 JSON 存储数据改为使用 sqlite。我在 node.js 中使用 sqlite3 并尝试创建一个函数来创建/检索玩家的数据。我的目标是让这个函数返回查询中的数据,但我正在绞尽脑汁试图找出我做错了什么。我读过,我需要使用发送到查询函数的回调,但这对我来说也不起作用(也不会实现此函数的目标)。
因此,有关如何创建函数以从查询返回数据的任何帮助都将非常有帮助!这是我在放弃之前所拥有的代码,并决定在我失去更多头发之前来这里寻求帮助。其他一切都按我的预期工作,我只是无法从 db.each() 检索数据。
exports.getPlayerData = function(players,msg,mention = false){
if(mention){
// console.log("mention found");
var member = msg.mentions.users.first();
} else {
var member = msg.member.user;
};
var db = new sqlite3.Database('data/levels/' + msg.guild.id + '.db');
var check;
db.serialize(function() {
var stmt = "CREATE TABLE if not exists uid_" + member.id + " (id INTEGER PRIMARY KEY, username TEXT, avatarID TEXT, avatarURL TEXT, xp INTEGER, level INTEGER, lastXp INTEGER)";
db.run(stmt);
db.run("INSERT OR IGNORE INTO uid_" + member.id + " (id,username,avatarURL,xp,level,lastXP) VALUES (?,?,?,?,?,?)", member.id,member.username, member.avatarURL , 0, 0, 0);
db.each("SELECT * FROM uid_" + member.id + " WHERE id = " + member.id , function(err, row) {
console.log(row);
return row;
});
});
// return row;
db.close();
}
最佳答案
如果我正确理解您的问题,那么您一定面临与 return
语句的放置相关的问题。您想要返回所有行,但由于代码的异步性质而无法返回。
我检查了sqlite3
的.each
的文档,发现存在complete
回调,可以在调用后调用获取所有行。在该回调中,您可以返回包含行集合的 data
数组。
更新:您必须使用回调
exports.getPlayerData = function(players,msg,mention = false, callback){
if(mention){
// console.log("mention found");
var member = msg.mentions.users.first();
} else {
var member = msg.member.user;
};
var db = new sqlite3.Database('data/levels/' + msg.guild.id + '.db');
var data = []; //for storing the rows.
db.serialize(function() {
var stmt = "CREATE TABLE if not exists uid_" + member.id + " (id INTEGER PRIMARY KEY, username TEXT, avatarID TEXT, avatarURL TEXT, xp INTEGER, level INTEGER, lastXp INTEGER)";
db.run(stmt);
db.run("INSERT OR IGNORE INTO uid_" + member.id + " (id,username,avatarURL,xp,level,lastXP) VALUES (?,?,?,?,?,?)", member.id,member.username, member.avatarURL , 0, 0, 0);
db.each("SELECT * FROM uid_" + member.id + " WHERE id = " + member.id , function(err, row) {
data.push(row); //pushing rows into array
}, function(){ // calling function when all rows have been pulled
db.close(); //closing connection
callback(data);
});
});
}
必须通过回调来获取玩家数据。
getPlayerData(players, msg, false, function(data){
console.log(data);
});
希望它对您有用并拯救您的头发:)。如果有任何问题请告诉我。
关于node.js - 从node.js中的SQLite3查询返回数据的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41319756/