詳解nodejs微信公眾號(hào)開發(fā)——3.封裝消息響應(yīng)模塊
上一篇文章:nodejs微信公眾號(hào)開發(fā)(2)自動(dòng)回復(fù),實(shí)現(xiàn)了簡(jiǎn)單的關(guān)注回復(fù)。采用拼接字符串的形式,并不是很方便,這里我們將其封裝承接口。
1. ejs模板引擎
不使用拼接字符串的方式,那么模板引擎就是較好的選擇。Nodejs開源模板的選擇很多,程序中使用 EJS,有Classic ASP/PHP/JSP的經(jīng)驗(yàn)用起EJS來的確可以很自然,也就是說,你能夠在 <%...%> 塊中安排 JavaScript 代碼,利用最傳統(tǒng)的方式 <%=輸出變量%>(另外 <%-輸出變量是不會(huì)對(duì) & 等符號(hào)進(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,我們將公眾號(hào)業(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ù)消息
我們?cè)赪echat原型鏈上增加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中,里面簡(jiǎn)單的實(shí)現(xiàn)了關(guān)注和取關(guān)的事件處理。
由于koa框架是基于ES6,里面充斥了大量的Promise、genarator、yield等內(nèi)容,對(duì)ES6不了解的,可以學(xué)習(xí)一下此篇文章:ECMAScript6快速入手攻略
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- NodeJS實(shí)現(xiàn)微信公眾號(hào)關(guān)注后自動(dòng)回復(fù)功能
- 詳解nodejs微信公眾號(hào)開發(fā)——6.自定義菜單
- 詳解nodejs微信公眾號(hào)開發(fā)——5.素材管理接口
- 詳解nodejs微信公眾號(hào)開發(fā)——4.自動(dòng)回復(fù)各種消息
- 詳解nodejs微信公眾號(hào)開發(fā)——2.自動(dòng)回復(fù)
- 詳解nodejs微信公眾號(hào)開發(fā)——1.接入微信公眾號(hào)
- nodejs微信公眾號(hào)支付開發(fā)
- 使用NodeJs 開發(fā)微信公眾號(hào)(三)微信事件交互實(shí)例
- 使用Nodejs開發(fā)微信公眾號(hào)后臺(tái)服務(wù)實(shí)例
- 詳解NodeJs開發(fā)微信公眾號(hào)
相關(guān)文章
簡(jiǎn)單談?wù)勱P(guān)于 npm 5.0 的新坑
最近使用到了npm5.0,第一次使用確實(shí)被驚艷了,但隨著而來的是一些坑,下面這篇文章主要給大家簡(jiǎn)單介紹了關(guān)于npm 5的一些新坑,需要的朋友可以參考學(xué)習(xí),下面來一起看看吧。2017-06-06
從零學(xué)習(xí)node.js之mysql數(shù)據(jù)庫的操作(五)
因?yàn)榻佑|Node.JS已經(jīng)有一段時(shí)間了,最近粗略的研究了一下node.js操作數(shù)據(jù)庫的包,覺得node.js連接數(shù)據(jù)庫不錯(cuò)。下面這篇文章主要給大家介紹了node.js之mysql數(shù)據(jù)庫操作的相關(guān)資料,需要的朋友可以參考下。2017-02-02
Node.js之如何創(chuàng)建TCP服務(wù)器端
這篇文章主要介紹了Node.js之如何創(chuàng)建TCP服務(wù)器端問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-09-09
Vue+Node服務(wù)器查詢Mongo數(shù)據(jù)庫及頁面數(shù)據(jù)傳遞操作實(shí)例分析
這篇文章主要介紹了Vue+Node服務(wù)器查詢Mongo數(shù)據(jù)庫及頁面數(shù)據(jù)傳遞操作,結(jié)合實(shí)例形式分析了node.js查詢MongoDB數(shù)據(jù)庫及vue前臺(tái)頁面渲染等相關(guān)操作技巧,需要的朋友可以參考下2019-12-12

