我为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();
}
答案 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});
}