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

当从数据库中查询大量数据,并希望单独处理每一条查询到的数据时,可以使用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();
		})
	}
})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值