node.js中变量的有效性与sqlite3

时间:2016-10-08 15:50:15

标签: javascript node.js sqlite node-sqlite3

我在node.js中的sqlite3上做了一个select语句。我想将结果放在变量“data”中,该变量在sqlite代码块之外定义,但它保持为空。在sqlite代码块中,数据变量具有正确的值。有人知道我做错了吗?

谢谢。

    /* Client connects via socket.io */
    io.on('connection', function(client) {
        console.log('Client connected');

        /* Client needs data... */
        client.on('needData', function(fields) {
            var data = [];
            var sql_stmt = "SELECT ...";
            if(fs.existsSync(db_file)) {
                try {
                    var db = new sqlite3.Database(db_file);
                    db.all(sql_stmt, function(err, all) {
                        data = all;
                        console.log(data); //--> data has valid values
                    }); 
                    db.close();
                    console.log(data); //--> data is empty
                }
                catch(e) {
                    console.log("Error with database. Error: ", e); 
                }   
            }
            else {
                console.log("Database file not found.");
            }

            client.emit('data', data);
        });
    });

1 个答案:

答案 0 :(得分:0)

只是因为asynchronous Node.js性质promises您可以通过 var async=require('async'); /* Client connects via socket.io */ io.on('connection', function(client) { console.log('Client connected'); /* Client needs data... */ client.on('needData', function(fields) { async.waterfall([function(next) { var sql_stmt = "SELECT ..."; if (fs.existsSync(db_file)) { try { var db = new sqlite3.Database(db_file); db.all(sql_stmt, function(err, all) { next(null,all) }); db.close(); } catch (e) { console.log("Error with database. Error: ", e); next(); } } else { console.log("Database file not found."); next(); } }], function(err, data) { if (!err) { client.emit('data', data); } }) }); });

处理它而发生这种情况

我建议使用waterfall模块的async方法

pdb