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:/”);
崩掉的问题要学会写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)