node.js - 从node.js中的SQLite3查询返回数据的函数

标签 node.js sqlite

我正在为 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/

相关文章:

node.js - Mongo .get 返回垃圾

javascript - JSDom 不加载相关脚本

python - SQLite - 计算移动平均值

iphone - iPhone 中 sqlite 数据库的最大数量?

python-2.7 - 使用多个版本的 py2.7 安装 Google Cloud SDK 时出现 sqlite3 错误

java - 如何识别SQLite数据库查询异常?

javascript - 运行 iron-node 时出现 Heapdump 错误

node.js - 仅在 readFile() Node js Electron 之后杀死子进程

javascript - 如何删除 X-Frame-Options 响应 header ,允许应用程序进行 iframe

android - 如何将 SQLite 数据库中的数据添加到 ArrayList (Android)