在定时短信提醒项目中,使用nodejs开发,
设计为每10秒轮询一次数据库,获取普通短信提醒。
1、定时器代码:
//定时更新会话,10秒刷新一次
app.use('/___updatesession___', (req, res, next)=>{
//对于普通短信提醒的触发
getNormal();
var resData = {
errno: 0,
data: 'success'
};
res.send(resData);
});
2、同步开发的普通短信提醒:
var getNormal = co.wrap(function *(){
var ret = yield pify.promisify(db.get_normal);
var res = ret[0];
var data = ret[1];
if ((res == false) || (data == 0))
{
return;
}
for (var i = 0; i < data.length; i++)
{
var content = data[i]["content"];
var submailprj = data[i]["submailprj"];
var custom = data[i]["custom"];
var checkstatus = data[i]["checkstatus"];
var templateid = data[i]["templateid"];
var mobiles = data[i]["mobiles"];
var smscnt = data[i]["smscnt"];
var id = data[i]["id"];
var userid = data[i]["createuserid"];
console.log("content:", content);
if (mobiles == "")
{
continue;
}
//手机号
var arrMobile = dealMobile(mobiles);
if (arrMobile.length == 0)
{
continue;
}
//短信数
smscnt = dealSmscnt(arrMobile, smscnt);
console.log("arrMobile:", arrMobile.join(","), "custom:", custom, "checkstatus:", checkstatus, "id:", id);
//发送短信
if (custom == "1") //定制类
{
if (checkstatus == "2") //审核通过的
{
console.log("SendFixedSmsWithPrj: ", arrMobile.join(","), templateid);
}
else if (checkstatus == "3")
{
//更新为已触发
yield pify.promisify(id, db.upd_result);
continue;
}
else
{
continue;
}
}
else //非定制
{
if ((submailprj == "") || (submailprj == undefined))
{
console.log("Send normal:"+ arrMobile.join(","));
}
else
{
console.log("SendWithPrj: "+ arrMobile.join(",") + content + submailprj);
}
}
var upd = "2";
var openid = "";
var weid = "";
//获取openid
var oRet = yield pify.promisify(userid, db.get_weidopenid);
var oRes = oRet[0];
var oData = oRet[1];
if ((oRes == false) || (oData == 0))
{
continue;
}
openid = oData.openid;
weid = oData.id;
if ((openid == undefined) || (openid == ""))
{
continue;
}
var reqData = {
weid: weid,
openid: openid,
upd : upd,
smscnt: smscnt,
originalid: id
};
//计费
yield pify.promisify(reqData, db.consume_smscnt);
//更新为已触发
yield pify.promisify(id, db.upd_result);
}
})
如上,这里核心代码为:
var getNormal = co.wrap(function *(){
var ret = yield pify.promisify(db.get_normal);
var oRet = yield pify.promisify(userid, db.get_weidopenid);
yield pify.promisify(reqData, db.consume_smscnt);
yield pify.promisify(id, db.upd_result);
}
app.use('/___updatesession___', (req, res, next)=>{
getNormal();
}
即需要用到同步时,用var fn = co.wrap(function *(){ });
调用时,直接调用fn();即可。
注: 在nodejs中开发最关键的就是这一块,这一块搞明白了,相当于nodejs就完全掌握了,可以开发各种应用了!