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