关于nodejs的sqlite3模块的疑问
发布于 2年前 作者 canic 4911 次浏览

nodejs新手,最近用nodejs练手,写了个文件分析的程序。大体逻辑是:

1 用file-utils模块列举某个目录下所有文件 2 如果是html文件,抽取其中的内容(本为异步抽取,为了简便代码中写成同步模式) 3 【关键】将内容(content为数组,其元素是数组)调用saveReport函数,保存到sqlite数据库中。原意是希望插入cover_report后,立刻查到cover_report自动生成的id,然后再根据文本内容插入到raw_data(content的长度不固定)。

如果是一般的程序开发,应该用同一个事物保证这件事情的顺序性,但在nodejs环境下,一切皆异步,很难保证顺序。虽然sqlite保证生成cover_report数据会先于raw_data,但是无法按照cover_report->raw_data->cover_report->raw_data…这样的顺序插入。最后导致的结果是cover_report->cover_report->cover_report->raw_data->raw_data->raw_data

这有什么问题呢?目录下的文件有很多,sqlite又不是立刻写入的,因此运行了半天数据库一条记录都没有,一旦程序蹦了就全没了(这也许也是sqlite3模块的问题)。

不知道各位高手有什么办法保证事务呢?有什么号的办法呢?

var sqlite3 = require(‘sqlite3’).verbose(); var db = new sqlite3.Database(‘flaws.sqlite’);

function saveReport(path, filename, content) { // console.log(“SAVE REPORT:” + path); db.serialize(function() { var stmt = db.prepare(“INSERT INTO cover_report(filename,path) VALUES (?,?);”); stmt.run([filename, path]); stmt.finalize();

    console.log("COVER REPORT:" + path);
    db.each("SELECT id FROM cover_report where path = ?", [path], function(err, row) {
        var id = row.id;
        console.log("GET ID:" + id);
        var stmt2 = db.prepare("INSERT INTO raw_data(flawno,flawid,title,degree,url,fix,param,filename,reportid) VALUES (?,?,?,?,?,?,?,?,?)");
        for(var i = 0, len = content.length; i < len; ++i) {
            content[i].push(filename);
            content[i].push(id);
            stmt2.run(content[i]);
        }
        stmt2.finalize();
    });
});

}

function listTarget(root) { var fileUtils = require(“file-utils”); var File = fileUtils.File;

new File(root).list(function(name, path) {

    //console.log(name);
    var index = name.indexOf(".html");
    if(index >= 0) {
        //其实是异步抽取,为了简便所以简化为同步
        var content = extract(name); 
        saveReport(path, name, content);
    }
    return true;
}, 10, function() {
});

}

listTarget(“c:/”);

3 回复

崩掉的问题要学会写try catch。 保证顺序有很多种方法: 简单的就是用流程控制模块,如async,eventproxy,wind.js; 如果不用模块就要改变写其它语言时的习惯,适应异步。简单的说就是:return value 改成callback(err, value)。 关于事务,简单的理解就是个sql队列一次性执行,不过因为没用过sqlite所以不是很清楚这个模块,模块说明里面应该有写吧。

楼主的nodejs是运行在什么操作系统之上的呢? 是windows吗? 我在windows上npm install sqlite3装不上啊? 求助!(https://github.com/developmentseed/node-sqlite3

请问楼主的问题最终是如何解决的呢?我在使用sqlit3保存聊天记录时也发生了插入结果的顺序与调用插入接口的顺序不一致的现象。请问你是如何实现使插入数据结果的顺序与调用插入接口的顺序已知的呢?

回到顶部