使用archiver在nodejs下打包
刚在cms系统上添加了一个数据备份的功能,也是自己随性瞎写的,没有规划,率性而为,鼓捣了大半天,功能基本上实现了,主要作用是手动对数据库进行备份并生成压缩文件,当然也包含管理功能,比如删除备份。
刚在cms系统上添加了一个数据备份的功能,也是自己随性瞎写的,没有规划,率性而为,鼓捣了大半天,功能基本上实现了,主要作用是手动对数据库进行备份并生成压缩文件,当然也包含管理功能,比如删除备份。下面通过介绍改功能介绍一下nodejs的archiver组件。
其实原生的nodejs 已经自带了gzip (zlib)压缩,开始也尝试过,比较简单,实现方式如下:
var zlib = require("zlib");
var gzip = zlib.createGzip();
var fs = require("fs");
var inp = fs.createReadStream("test.txt");
var out = fs.createWriteStream("test.txt.gz");
// 压缩管道
inp.pipe(gzip).pipe(out);
基本和官网上代码一致,创建读文件流 —— 创建压缩文件流 , 通过压缩管道生成压缩文件。 但是尝试后发现gzip只对单个文件有效,对于文件夹是没有效果的,当然,通过进一步的处理可能也可以达到效果,没有尝试。google了一下,找到了一个比较合适的组件archiver,实现方法也比较简单。
archiver是一个在nodejs中能跨平台实现打包功能的模块,可以打zip和tar包,是一个比较好用的三方模块。
使用前先安装archiver模块。
npm install archiver
实现数据库备份代码:
var fs = require('fs');
var child = require('child_process');
var archiver = require('archiver');
backUpData : function(res,req){ // 数据备份
var date = new Date();
// var ms = Date.parse(date);
var ms = moment(date).format('YYYYMMDDHHmmss').toString();
var dataPath = Settings.DATABACKFORDER + ms;
var cmdstr = 'mongodump -o "'+dataPath+'"';
// var cmdstr = 'mongodump -u '+Settings.USERNAME+' -p '+Settings.PASSWORD+' -d '+Settings.DB+' -o "'+dataPath+'"';
var batPath = Settings.DATAOPERATION + '/backupData.bat';
if(!fs.existsSync(Settings.DATABACKFORDER)){
fs.mkdirSync(Settings.DATABACKFORDER);
}
if (fs.existsSync(dataPath)) {
console.log('已经创建过备份了');
} else {
fs.mkdir(dataPath,0777,function(err1){
if (err1) throw err1;
if( fs.existsSync(batPath) ) {
//写入文件
fs.writeFile(batPath,cmdstr,function (err2) {
if(err2){
console.log(err2)
}
else{
console.log("----文件写入成功-----")
var exec = child.exec;
exec('call "'+batPath,
function (error, stdout, stderr) {
if (error !== null) {
//console.log('exec error: ' + error);
}else{
console.log('备份成功');
// 生成压缩文件
var output = fs.createWriteStream(Settings.DATABACKFORDER + ms +'.zip');
var archive = archiver('zip');
archive.on('error', function(err){
throw err;
});
archive.pipe(output);
archive.bulk([
{ src: [dataPath+'/**']}
]);
archive.finalize();
// 操作记录入库
var optLog = new DataOptionLog();
optLog.logs = "数据备份";
optLog.path = dataPath;
optLog.fileName = ms +'.zip';
optLog.save(function(err3){
if (err3) throw err3;
res.end("success");
})
}
});
}
}) ;
}
})
}
}
实现文件夹压缩代码:
// 生成压缩文件
var output = fs.createWriteStream(Settings.DATABACKFORDER + ms +'.zip');
var archive = archiver('zip');
archive.on('error', function(err){
throw err;
});
archive.pipe(output);
archive.bulk([
{ src: [dataPath+'/**']}
]);
archive.finalize();
实现思路: 1、通过nodeJs的子进程 require('child_process') 的exec 方法执行 bat文件
2、bat动态写入执行脚本,脚本中动态定义数据表备份文件夹(按照备份时间生成时间为文件夹名称)
3、执行脚本 mongodump -o "E:/mongodata/20150624082952" ,即mongodb自带的备份脚本
4、数据备份
5、将备份文件夹压缩到指定目录下。
后台执行备份后的效果:
很赞哦! ( 0
)