我正在为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);
});
希望它为您工作,并保存您的头发:)。让我知道,如果有任何问题。
| 归档时间: | 
 | 
| 查看次数: | 4205 次 | 
| 最近记录: |