詳解nodejs微信公眾號開發(fā)——3.封裝消息響應(yīng)模塊
上一篇文章:nodejs微信公眾號開發(fā)(2)自動(dòng)回復(fù),實(shí)現(xiàn)了簡單的關(guān)注回復(fù)。采用拼接字符串的形式,并不是很方便,這里我們將其封裝承接口。
1. ejs模板引擎
不使用拼接字符串的方式,那么模板引擎就是較好的選擇。Nodejs開源模板的選擇很多,程序中使用 EJS
,有Classic ASP/PHP/JSP
的經(jīng)驗(yàn)用起EJS
來的確可以很自然,也就是說,你能夠在 <%...%>
塊中安排 JavaScript 代碼,利用最傳統(tǒng)的方式 <%=輸出變量%>
(另外 <%-輸出變量是不會(huì)對 & 等符號進(jìn)行轉(zhuǎn)義的).
2. heredoc
在php、python中都有heredoc方式的字符串定義方法,JavaScript也實(shí)現(xiàn)了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
中之前直接回復(fù)消息的那部分代碼,我們將處理回復(fù)內(nèi)容的邏輯交給業(yè)務(wù)層,等其處理完畢,繼續(xù)執(zhí)行下面的代碼,封裝消息內(nèi)容成xml并回復(fù)出去。
var message = util.formatMessage(content.xml); this.weixin = message; //掛載消息 yield handler.call(this,next); //轉(zhuǎn)到業(yè)務(wù)層邏輯 wechat.replay.call(this); //真正回復(fù)
4.業(yè)務(wù)層的處理邏輯
app.js
里面中間件的使用方式修改為:
var weixin = require('./weixin'); ... app.use(wechat(config.wechat,weixin.reply));
weixin.reply
即generator.js
中的handler
,我們將公眾號業(yè)務(wù)成的邏輯都寫在weixin.js
里面,如回復(fù)消息、將來的爬取電影網(wǎng)站信息、支付等。
exports.reply = function* (next){ var message = this.weixin; if(message.magType === 'event'){ if(message.Event === 'subscribe'){ if(message.EventKey) console.log('掃描二維碼關(guān)注:'+message.EventKey+' '+message.ticket); this.body = '終于等到你,還好我沒放棄'; }else if(message.Event === 'unsubscribe'){ console.log(message.FromUserName +' 悄悄地走了...'); } }else{ // } yield next; }
5.回復(fù)消息
我們在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; }
這樣實(shí)現(xiàn)了wechat.replay.call(this);
的回復(fù)消息功能。
6.總結(jié)
上面代碼已經(jīng)基本實(shí)現(xiàn)了消息的封裝,回復(fù)規(guī)則和回復(fù)內(nèi)容寫在業(yè)務(wù)層代碼weixin.js
中,里面簡單的實(shí)現(xiàn)了關(guān)注和取關(guān)的事件處理。
由于koa
框架是基于ES6
,里面充斥了大量的Promise
、genarator
、yield
等內(nèi)容,對ES6
不了解的,可以學(xué)習(xí)一下此篇文章:ECMAScript6快速入手攻略
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- NodeJS實(shí)現(xiàn)微信公眾號關(guān)注后自動(dòng)回復(fù)功能
- 詳解nodejs微信公眾號開發(fā)——6.自定義菜單
- 詳解nodejs微信公眾號開發(fā)——5.素材管理接口
- 詳解nodejs微信公眾號開發(fā)——4.自動(dòng)回復(fù)各種消息
- 詳解nodejs微信公眾號開發(fā)——2.自動(dòng)回復(fù)
- 詳解nodejs微信公眾號開發(fā)——1.接入微信公眾號
- nodejs微信公眾號支付開發(fā)
- 使用NodeJs 開發(fā)微信公眾號(三)微信事件交互實(shí)例
- 使用Nodejs開發(fā)微信公眾號后臺服務(wù)實(shí)例
- 詳解NodeJs開發(fā)微信公眾號
相關(guān)文章
Nodejs讀取本地json文件,輸出json數(shù)據(jù)接口方式
這篇文章主要介紹了Nodejs讀取本地json文件,輸出json數(shù)據(jù)接口方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10詳解通過源碼解析Node.js中cluster模塊的主要功能實(shí)現(xiàn)
這篇文章主要介紹了詳解通過源碼解析Node.js中cluster模塊的主要功能實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05基于Node.js實(shí)現(xiàn)nodemailer郵件發(fā)送
Nodemailer 是一個(gè)簡單易用的 Node.JS 郵件發(fā)送模塊(通過 SMTP,sendmail,或者 Amazon SES),支持 unicode,你可以使用任何你喜歡的字符集。Nodemailer是一個(gè)簡單易用的Node.js郵件發(fā)送組件,需要的朋友可以參考下2016-01-01nodejs密碼加密中生成隨機(jī)數(shù)的實(shí)例代碼
本篇文章主要介紹了nodejs密碼加密中生成隨機(jī)數(shù)的實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07Linux 安裝nodejs環(huán)境及路徑配置詳細(xì)步驟
大家都知道linux安裝nodejs有兩種比較常用的方法,一種解壓即可用的方法操作比較簡便,另一種方法通過編譯來安裝,本文重點(diǎn)給大家講解第一種方法,感興趣的朋友跟隨小編一起看看吧2021-11-11Node.js完整實(shí)現(xiàn)博客系統(tǒng)詳解
這篇文章主要介紹了Node.js完整實(shí)現(xiàn)一個(gè)博客系統(tǒng)的流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08node.js中的fs.createWriteStream方法使用說明
這篇文章主要介紹了node.js中的fs.createWriteStream方法使用說明,本文介紹了fs.createWriteStream方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12nodejs文件實(shí)現(xiàn)打包成exe, 并設(shè)置開機(jī)自啟動(dòng)的方法詳解(沒有黑窗口)
這篇文章主要介紹了nodejs文件實(shí)現(xiàn)打包成exe, 并設(shè)置開機(jī)自啟動(dòng)的方法,結(jié)合實(shí)例形式分析了node.js使用pkg包實(shí)現(xiàn)生成exe可執(zhí)行文件的相關(guān)操作技巧,需要的朋友可以參考下2023-05-05淺談node如何優(yōu)雅地獲取mac系統(tǒng)版本
這篇文章主要和大家聊聊node如何優(yōu)雅地獲取mac系統(tǒng)版本,文中有詳細(xì)的代碼示例和流程步驟,對我們學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-06-06