将sqlite3 db中的值复制到node.js中的全局数组

时间:2012-04-06 16:48:31

标签: node.js sqlite

我使用了node_sqlite3模块,我尝试了以下示例:

var sqlite = require('sqlite3').verbose();
var db = new sqlite.Database("/var/www/signals/db/app3.db");

var matrixSignals = new Array();
var i;

i = 0;
db.all('SELECT * FROM tbl_signals', function(err,rows){
    rows.forEach(function(row) {
        matrixSignals[i] = new Object();
        matrixSignals[i].signalID = row.signalID;
        matrixSignals[i].connID = row.connID;
        i++;
    });
    db.close();
    console.log('1:' + matrixSignals.length);
});
console.log('2:' + matrixSignals.length);

在控制台输出1中长度是正确的但在控制台输出2中长度始终为0.我如何将matrixSignals设置为全局变量?

1 个答案:

答案 0 :(得分:3)

这不起作用的原因与Node.js的运作方式有关。在节点中,所有代码都是异步执行的;在您记录输出2时,matrixSignals的长度仍为0.这是因为在您启动数据库查询后,代码将继续执行。记录输出1仅在数据库查询完成后执行,这就是它返回正确结果的原因。

因此,对您的问题的简单回答是无法将matrixSignals设置为全局变量。如果您的所有逻辑都真正依赖于该数组中的值,那么您的逻辑应该在数据库调用的回调中 - 这样它只有在从数据库中检索到数据后才会执行该代码。如果你只是希望语法更清晰,你可能会使用像node-promise(https://github.com/kriszyp/node-promise)这样的东西,但我认为这可能比它的价值更多。