关于nodejs的sqlite3模块的疑问
发布于 12 年前 作者 canic 20956 次浏览 最后一次编辑是 8 年前

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:/”);

2 回复

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

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

回到顶部