nodejs实现,每天定时自动读取数据库数据-生成excel表格-发送给老板邮箱(promise版)

58 篇文章 16 订阅
57 篇文章 34 订阅

async版:http://blog.csdn.net/zzwwjjdj1/article/details/52129192

写这个版本主要是,promise比较好用,而且,现在已经是nodejs的内置对象了,无须再引用第三方库

-- 需要的工具

数据库    mysql
连接数据库模块 mysql  基本封装: http://blog.csdn.net/zzwwjjdj1/article/details/51991348
自动运行模块   node-schedule 基本使用 : http://blog.csdn.net/zzwwjjdj1/article/details/51898257
生成excel表格   node-xlsx
发送邮件   nodemailer 基本使用 : http://blog.csdn.net/zzwwjjdj1/article/details/51878392

-- 安装模块

我在F盘建立了一个文件夹 : automation
npm install mysql
npm install node-schedule
npm install node-xlsx
npm install nodemailer

-- 封装3个方法

1.访问数据库
2.发送邮件

3.格式化时间

promise.js

/*
工具类
2016年8月22日09:07:50
 */

var db    = {};  
var mysql = require('mysql');  
var nodemailer = require('nodemailer');
var pool  = mysql.createPool({  
  connectionLimit : 10,  
  host            : 'localhost',  
  user            : 'root',  
  password        : '123456',  
  database        : 'nodejs'  
});  

//执行sql语句并返回结果  
db.query = function(sql){  

  return new Promise(function(resolve, reject){

    if (!sql) {  
        reject('传参错误!');  
        return;  
    }  

    pool.query(sql, function(err, rows, fields) {  
      if (err) {  
        console.log(err);  
        reject(err) 
        return;  
      };  

      resolve(rows);
    });  
  })
  
};

//发送邮件,带附件
db.sendMail = function (xlsxname) {

  var transporter = nodemailer.createTransport({
    service: 'qq',
    auth: {
      user: '452076103@qq.com',
      pass: 'drckgvaniifuxxxx'   
    }
  });

  var mailOptions = {
    from: '452076103@qq.com', 
    to: `527828938@qq.com`, 
    subject: '老板,您要的excel来了,格式您自己处理下!', 
    html: `<h2>我发誓,我是手动导出的</h2>` ,
    attachments:[{
    	filename : xlsxname,
    	path : `./${xlsxname}`
    }]
  };
  return new Promise(function(resolve, reject){

    transporter.sendMail(mailOptions, function (error, info) {
      if (error) {
        reject(error);
      }else{
        resolve(info);
      }
    });
  })
}

//格式化当前时间
db.nowDate = function(){
	var date = new Date();
	var fmtTwo = function (number) {
    return (number < 10 ? '0' : '') + number;
  }
 	var yyyy = date.getFullYear();
  var MM = fmtTwo(date.getMonth() + 1);
  var dd = fmtTwo(date.getDate());

  var HH = fmtTwo(date.getHours());
  var mm = fmtTwo(date.getMinutes());
  var ss = fmtTwo(date.getSeconds());

  return '' + yyyy + '-' + MM + '-' + dd + ' ' + HH + ':' + mm + ':' + ss;

}  
module.exports = db; 

-- 测试代码

auto.js
var xlsx = require('node-xlsx');
var schedule = require("node-schedule");
var mysql = require('./promise');
var fs = require('fs');
var auto = function(){

	mysql
	//查询数据,并转化成生成xlsx所需的格式
		.query('select * from Users')
		.then(function(rows){
			var datas = [];
			rows.forEach(function(row){
			var newRow = [];
				for(var key in row){
					newRow.push(row[key]);
				}
				datas.push(newRow);
			})
			return Promise.resolve(datas);
		})
		//生成xlsx文件
		.then(function(datas){
			var buffer = xlsx.build([{name: "今天的收入", data: datas}]);
			var xlsxname = `${mysql.nowDate().split(' ')[0]}.xlsx`;
			return new Promise(function(resolve, reject){

				fs.writeFile(xlsxname, buffer, 'binary',function(err){
					if (err) {
						throw new error('创建excel异常');
						return;
					}
					resolve(xlsxname)
				})
			})
		})
		//发送邮件,返回信息
		.then(function(xlsxname){

			return mysql.sendMail(xlsxname);
		})
		.then(function(info){
			console.log(info);
		})
		//捕捉未处理的异常
		.catch(function(e){
			console.log(e);
		});
	
}

var rule      = new schedule.RecurrenceRule();
var t = [];
for (var i = 0; i < 60; i++) {
	t.push(i);
}
var times     = t;
rule.second   = times;
schedule.scheduleJob(rule, function(){
  auto();
});

-- 运行

为了看到效果,自动执行设置为1秒执行一次.
--邮件--

--具体内容--

--打印信息--

--数据库--

--excel--

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值