【问题标题】:Function to return data from SQLite3 query in node.js从 node.js 中的 SQLite3 查询返回数据的函数
【发布时间】:2017-05-10 05:46:03
【问题描述】:

我正在为 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();

}

【问题讨论】:

    标签: node.js sqlite


    【解决方案1】:

    如果我正确理解了您的问题,那么您一定面临与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);
    });
    

    希望它对您有用并拯救您的头发 :)。如果有任何问题,请告诉我。

    【讨论】:

    • 我也尝试过类似的事情,不幸的是,仍然得到一个未定义的结果。不完全确定这里的交易是什么。看起来这应该更容易做......也许我应该研究与 sqlite3 不同的模块?
    • 我尝试并运行了上面的代码。它工作得很好。它没有返回 undefined。
    • 执行以下操作: var player = this.getPlayerData(players,msg,false);控制台.log(播放器);给我未定义。不知道我在这里缺少什么。
    • 我没有这样检查。为此,您必须使用回调。检查我更新的答案。
    • 非常感谢!!我喜欢这些问题几乎总是最终成为最简单的解决方案,,, 在我的代码中,我确实尝试了 getPlayerData 上的回调。我有 getPlayerData(players, msg, false, function(){...}。这可以解释我的问题!再次感谢!
    【解决方案2】:

    你应该使用 wait.for npm。

    更多示例可以在这里找到:https://www.npmjs.com/package/wait.for

    您可以在下面找到对我有用的共享代码:

    var wait = req.app.get('wait');
    wait.launchFiber(handleGet, req, res);
    function handleGet(req, res)
    {   
        var slashes     =   req.app.get('slashes');
        var connection = req.app.get('connection');
        var user_lib = req.app.get('user_lib'); 
        var user_id = req.params.userId;    
        user_id = slashes.add(user_id);
        var user_insert_id = wait.for(user_lib.update_user_status, connection, user_id);
        res.render('view/email_verification', { req:req, res:res});
    }
    

    用户代码库文件:

    Object.prototype.update_user_status=function (connection, cc_user_id, callback)
    {
         connection.query('update cc_user set cc_user_active="yes" where cc_user_id ="'+cc_user_id+'"',function(err,rows){      
            if(err) throw err;          
            if(rows)
            {
                return callback(err,{rows:rows});
            }
        }); 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-16
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      相关资源
      最近更新 更多