项目要求:1.对用户的煤、水、电的使用金额对用户进行每周短信提醒。
2.当爬虫爬来的煤、水、电的剩余金额小于10元时,对用户进行短信提醒。
数据库描诉:mongodb 建了4张表 分别分 每周提醒表、水费表、电费表、煤气表
每周提醒表:用户名、用户id、是否开/关提醒功能、用户是否关联煤、水、电、用户电话
电费表:用户名、用户id、社区编号、供电公司编号、是否开/关提醒、剩余电费、用户电话、更新时间、上次更新时间、上次更新剩余电费、
遇到问题描诉:使用nodejs开发,实现每周六晚上短信提醒用户功能。
通过每周提醒表得到用户的信息、根据信息判断用户是否有煤水电关联,如果关联去对应的煤水电的表里查询,然后将查询信息拼接成新的数据结构返回回来。
由于nodejs访问数据库的是异步请求得到数据不完整。所以使用async模块。
解决办法:
var scheduleObj = require(‘node-schedule‘); var mongoWake = require(‘./mongo/wakeSaturday‘); var mongoElectric = require(‘./mongo/mongoElectric‘); var mongoWater = require(‘./mongo/mongoWater‘); var mongoGas = require(‘./mongo/mongoGas‘); //引用async模块 var async = require(‘async‘); exports.schedule = function(){ var rule = new scheduleObj.RecurrenceRule(); var times = []; for(var i=1; i<60; i=i+10){ times.push(i); } //每周6 rule.dayOfWeek =6; //服务器上使用的是什么时间 是格林尼治时间 还是中国时间 rule.hour =22; rule.second = 0; var j = scheduleObj.scheduleJob(rule, function(){ //从周提醒的表里取出课题性的用户信息 mongoWake.getAll(function(err,result){ // console.log(result); if(err){ return console.log(err); } //把信息添加到mapseries里需要控制流程逐一接下来的查询 async.mapSeries(result,function(item,callbackMap){ item.result={}; // item.result[‘electric‘] = 10; // item.result[‘water‘] = 30; // item.result[‘gas‘] = 60; // callbackMap(null,item); //需要对查询的信息逐条判断,判断用户是否于煤水电进行关联,并寻要在每张表查询完返回的结果加入最后的result里 async.waterfall([searchElectric, searchWater, searchGas], function(){ callbackMap(null, item); }); function searchElectric(done){ if(item.types.electric){ console.log(‘electric balance‘); mongoElectric.findById(item.userId,function(err,eleResult){ // console.log(eleResult[0]); // obj.push(eleResult[0]); item.result[‘electric‘] = eleResult[0]; done(); }); }else{ done(); } }; function searchWater(done){ if(item.types.water){ console.log(‘water balance‘); mongoWater.findById(item.userId,function(err,waterResult){ item.result[‘water‘] = waterResult[0]; done(); }); }else{ done(); } }; function searchGas(done){ if(item.types.gas){ console.log(‘gas balance‘); mongoGas.findById(item.userId,function(err,gasResult){ item.result[‘gas‘] = gasResult[0]; done(); }); }else{ done(); } }; },function(err, results){ console.log(results); return results; }); }); }); };
原文:http://my.oschina.net/chinacaptain/blog/467455