您好,登錄后才能下訂單哦!
上一篇文章:nodejs微信公眾號開發(2)自動回復,實現了簡單的關注回復。采用拼接字符串的形式,并不是很方便,這里我們將其封裝承接口。
1. ejs模板引擎
不使用拼接字符串的方式,那么模板引擎就是較好的選擇。Nodejs開源模板的選擇很多,程序中使用 EJS
,有Classic ASP/PHP/JSP
的經驗用起EJS
來的確可以很自然,也就是說,你能夠在 <%...%>
塊中安排 JavaScript 代碼,利用最傳統的方式 <%=輸出變量%>
(另外 <%-輸出變量是不會對 & 等符號進行轉義的).
2. heredoc
在php、python中都有heredoc方式的字符串定義方法,JavaScript也實現了heredoc模塊,主要解決大量字符串拼接問題。
新建模板文件tpl.js
:
'use strict' var ejs = require('ejs'); var heredoc = require('heredoc'); var tpl = heredoc(function(content){/* <xml> <ToUserName><![CDATA[<%= toUserName %>]]></ToUserName> <FromUserName><![CDATA[<%= fromUserName %>]]></FromUserName> <CreateTime><%= createTime%></CreateTime> <MsgType><![CDATA[<%= msgType %>]]></MsgType> <% if(msgType ==='text') { %> <Content><![CDATA[<%= content %>]]></Content> <% }else if(msgType ==='image'){ %> <Image> <MediaId><![CDATA[<%= content.mediaId %>]]></MediaId> </Image> <% }else if(msgType ==='voice'){ %> <Voice> <MediaId><![CDATA[<%= content.mediaId %>]]></MediaId> </Voice> <% } %>else if(msgType ==='video'){ %> <Video> <MediaId><![CDATA[<%= content.mediaId %>]]></MediaId> <Title><![CDATA[<%= content.title %>]]></Title> <Description><![CDATA[<%= content.description %>]]></Description> </Video> <% } %>else if(msgType ==='music'){ %> <Music> <Title><![CDATA[<%= content.title %>]]></Title> <Description><![CDATA[<%= content.description %>]]></Description> <MusicUrl><![CDATA[<%= content.musicUrl %>]]></MusicUrl> <HQMusicUrl><![CDATA[<%= content.hqMusicUrl %>]]></HQMusicUrl> <ThumbMediaId><![CDATA[<%= content.thumbMediaId %>]]></ThumbMediaId> </Music> <% } %>else if(msgType ==='news'){ %> <ArticleCount><%= content.length %></ArticleCount> <Articles> <% content.forEach(function(item){ %> <item> <Title><![CDATA[<%= item.title %>]]></Title> <Description><![CDATA[<%= item.description %>]]></Description> <PicUrl><![CDATA[<%= item.picUrl %>]]></PicUrl> <Url><![CDATA[<%= item.url %>]]></Url> </item> <% }) %> </Articles> <% } %> </xml> */}); var compiled = ejs.compiled(tpl); exports = module.exports = { compiled:compiled };
3. 處理接收到的消息
修改generator.js
中之前直接回復消息的那部分代碼,我們將處理回復內容的邏輯交給業務層,等其處理完畢,繼續執行下面的代碼,封裝消息內容成xml并回復出去。
var message = util.formatMessage(content.xml); this.weixin = message; //掛載消息 yield handler.call(this,next); //轉到業務層邏輯 wechat.replay.call(this); //真正回復
4.業務層的處理邏輯
app.js
里面中間件的使用方式修改為:
var weixin = require('./weixin'); ... app.use(wechat(config.wechat,weixin.reply));
weixin.reply
即generator.js
中的handler
,我們將公眾號業務成的邏輯都寫在weixin.js
里面,如回復消息、將來的爬取電影網站信息、支付等。
exports.reply = function* (next){ var message = this.weixin; if(message.magType === 'event'){ if(message.Event === 'subscribe'){ if(message.EventKey) console.log('掃描二維碼關注:'+message.EventKey+' '+message.ticket); this.body = '終于等到你,還好我沒放棄'; }else if(message.Event === 'unsubscribe'){ console.log(message.FromUserName +' 悄悄地走了...'); } }else{ // } yield next; }
5.回復消息
我們在Wechat原型鏈上增加replay
方法:
Wechat.prototype.replay = function(){ var content = this.body; var message = this.weixin; var xml = util.tpl(content,message); this.status = 200; this.type = 'application/xml'; this.body = xml; }
這樣實現了wechat.replay.call(this);
的回復消息功能。
6.總結
上面代碼已經基本實現了消息的封裝,回復規則和回復內容寫在業務層代碼weixin.js
中,里面簡單的實現了關注和取關的事件處理。
由于koa
框架是基于ES6
,里面充斥了大量的Promise
、genarator
、yield
等內容,對ES6
不了解的,可以學習一下此篇文章:ECMAScript6快速入手攻略
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。