2016-12-25 58 views
0

我正在爲Discord製作一個bot,並且此bot中的一個功能是一個關卡系統。我決定從使用JSON來存儲數據到sqlite。我在node.js中使用了sqlite3,並試圖創建一個函數來創建/檢索玩家的數據。我的目標是讓這個函數從查詢中返回數據,但是我正在將自己的頭腦投入到一堵磚牆上,試圖弄清楚我做錯了什麼。我已經讀過,我需要使用發送到查詢函數的回調函數,但是這對我來說也不起作用(它也不適用於此函數的目標)。從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(); 

}

回答

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

希望它適合你,並保存你的頭髮:)。讓我知道,如果有任何問題。

+0

我試過的東西類似於此,不幸的是,仍然得不到這個。不完全確定交易是在這裏。似乎這應該更容易做...也許我應該看看不同於sqlite3的模塊? – AndyRob7

+0

我試過並在代碼上面運行。它運行良好。它沒有返回undefined。 –

+0

執行以下操作: var player = this.getPlayerData(players,msg,false); console.log(player); 給我未定義。不知道我在這裏錯過了什麼。 – AndyRob7

1

你應該去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}); 
     } 
    }); 
}