函数从node.js

时间:2016-12-25 08:34:49

标签: 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();

}

2 个答案:

答案 0 :(得分:4)

如果我正确理解您的问题,那么您必须面对与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);
});

希望它适合你并保存你的头发:)。如果有任何问题,请告诉我。

答案 1 :(得分:1)

你应该去wait.for npm。

更多示例可在此处找到:https://www.npmjs.com/package/wait.for

分享对我有用的代码,你可以找到它:

myStruct

用户代码lib文件:

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});
}