关闭

Node.js以数据流的方式处理查询数据

774人阅读 评论(0) 收藏 举报
分类:

当从数据库中查询大量数据,并希望单独处理每一条查询到的数据时,可以使用mysql模块中的query对象(不可以再使用query方法中的callback回调函数)

query对象包含以下四个事件:

fields 当接收到该表中的所有字段时触发

result 当接收到该表中的一条数据时触发

end 当接收完该表中的所有数据时触发

error 当接收数据的过程中产生错误时触发

注意:在对读取到的记录执行一个耗时较长或消耗资源较多的I/O操作时,connection对象的pause方法和resume方法可以帮助减轻读取大数据量时的压力

var mysql = require('mysql');
var fs = require('fs');
var connection = mysql.createConnection({
	host : 'localhost',
	port : 3306,
	database : 'test',
	user : 'root',
	password : ''
})
var out = fs.createWriteStream('./message.txt');
out.on('error',function(err){
	console.log('写文件操作失败,错误信息为:' + err.message);
	process.exit();
})
connection.connect(function(err){
	if(err){
		console.log('与mysql数据库建立连接失败');
	}else{
		console.log('与mysql数据库建立连接成功');
		var query = connection.query('select * from admin');
		//当接收数据的过程中产生错误时触发
		query.on('error',function(err){
			console.log('读取数据失败,错误信息为:' + err.message);
			process.exit();
		})
		//fields当接收到该表中的所有字段时触发
		.on('fields',function(fields){
			var str = "";
			fields.forEach(function(field){
				if(str != ""){
					//String.fromCharCode()表示将Unicode字符值转换为相应的字符串,这里的9表示一个制表符
					str += String.fromCharCode(9);
				}
				str += field.name;
			})
			out.write(str + '\r\n');
		})
		//result当接收到该表中的一条数据时触发
		.on('result',function(row){
			//暂停读取后续数据
			connection.pause();
			out.write(row.id + String.fromCharCode(9) + row.username + String.fromCharCode(9) + row.password + '\r\n',function(err){
				//恢复读取后续数据
				connection.resume();
			})
		})
		//end当接收完该表中的所有数据时触发
		.on('end',function(){
			console.log('数据全部写入完毕');
			connection.end();
		})
	}
})

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:163883次
    • 积分:4556
    • 等级:
    • 排名:第6715名
    • 原创:317篇
    • 转载:0篇
    • 译文:0篇
    • 评论:8条
    文章分类
    最新评论