当前位置: 首页 > 知识库问答 >
问题:

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

岑畅
2023-03-14

我正在为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个答案

郎嘉树
2023-03-14

你应该wait.fornpm。

更多示例可在此处找到: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});
        }
    }); 
}
松刚豪
2023-03-14

如果我正确理解了您的问题,那么您必须面对与return语句的位置相关的问题。您希望返回所有行,但由于代码的异步性质,无法返回。

我检查了sqlite3文档,发现存在complete回调,您可以在获取所有行后调用该回调。在该回调中,可以返回包含行集合的数据数组。

更新:您必须使用回调

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

希望它对您有效并保存了您的头发:)。如果有任何问题,请告诉我。

 类似资料:
  • 问题内容: 我想创建一个使用查询来计算值的函数,但返回值时遇到问题: 简而言之,我的查询是: 我收到一个SQL语法错误。 SQL错误(1064):您的SQL语法有错误; 问题答案: 假设这些都是通用名称(表将不是一个很好的表名),问题是您不能使用==进行比较。您还缺少一些关键语法(DECLARE,SELECT INTO等)。 更改为此: MySQL比较函数和运算符 相关问题:MYSQL中的单等于

  • 问题内容: 我在从Node.js中的回调函数返回值时遇到了小麻烦,我将尝试尽可能轻松地解释我的情况。考虑一下我有一个片段,它包含URL,并命中该URL,并提供输出: 我试图将其包装在函数中并返回如下值: 因为在我的Node.js代码中,我有很多语句将决定value的值,例如: 关键是a内的所有语句将保持相同,除了的值。因此,绝对需要将这些通用代码放入函数中。我尝试了同样的方法,但是in总是会回报我

  • 问题内容: 我正在使用nodejs通过Mongoose从Mongodb查询数据。获取数据后,我想对该数据做一些处理,然后再将其响应给客户端。但是我无法获得返回值。在Google上浏览后,我了解到Node.js函数是异步javascript函数(非I / O阻止)。我尝试了这个Tut( 问题答案: 获得未定义值的原因是因为find函数是异步的,并且可以随时完成。在您的情况下,使用后就结束了,因此在访

  • 我刚刚开始学习平均堆栈,我被卡住了。我需要将下面的查询数据发送到前端。 我试过这样做,但没有成功

  • 问题内容: 我有以下从数据库获取十六进制代码的函数 我的问题是我在回调函数中返回了结果,但getColour函数未返回任何内容。我希望getColour函数返回的值。 在我调用getColour的那一刻,它不返回任何内容 我尝试做类似的事情 但当然SELECT查询在返回值时已经完成 问题答案: 您只需要对回调中的db查询结果进行处理。就像。

  • 因此,我正在构建一个云函数,它接受customerID,根据customerID过滤文档,并返回文档列表。遗憾的是,它返回一个空数组。我相信这是一个简单的解决办法。 以下是云功能: 下面是我从客户端调用它时的代码。 此外,这里是一个萤火虫的屏幕截图。 firestore的截图