国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

詳解nodejs微信公眾號(hào)開(kāi)發(fā)――3.封裝消息響應(yīng)模塊

2019-11-19 16:52:24
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

上一篇文章:nodejs微信公眾號(hào)開(kāi)發(fā)(2)自動(dòng)回復(fù),實(shí)現(xiàn)了簡(jiǎn)單的關(guān)注回復(fù)。采用拼接字符串的形式,并不是很方便,這里我們將其封裝承接口。

1. ejs模板引擎

不使用拼接字符串的方式,那么模板引擎就是較好的選擇。Nodejs開(kāi)源模板的選擇很多,程序中使用 EJS,有Classic ASP/PHP/JSP的經(jīng)驗(yàn)用起EJS來(lái)的確可以很自然,也就是說(shuō),你能夠在 <%...%> 塊中安排 JavaScript 代碼,利用最傳統(tǒng)的方式 <%=輸出變量%>(另外 <%-輸出變量是不會(huì)對(duì) & 等符號(hào)進(jìn)行轉(zhuǎn)義的).

2. heredoc

在php、python中都有heredoc方式的字符串定義方法,JavaScript也實(shí)現(xiàn)了heredoc模塊,主要解決大量字符串拼接問(wèn)題。
新建模板文件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.replygenerator.js中的handler,我們將公眾號(hào)業(yè)務(wù)成的邏輯都寫(xiě)在weixin.js里面,如回復(fù)消息、將來(lái)的爬取電影網(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 = '終于等到你,還好我沒(méi)放棄';    }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)容寫(xiě)在業(yè)務(wù)層代碼weixin.js中,里面簡(jiǎn)單的實(shí)現(xiàn)了關(guān)注和取關(guān)的事件處理。

由于koa框架是基于ES6,里面充斥了大量的Promise、genaratoryield等內(nèi)容,對(duì)ES6不了解的,可以學(xué)習(xí)一下此篇文章:ECMAScript6快速入手攻略

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 阜宁县| 临邑县| 诏安县| 法库县| 漳州市| 黄山市| 大同县| 乌恰县| 南召县| 平顺县| 牡丹江市| 浑源县| 青铜峡市| 区。| 孟津县| 延川县| 瓦房店市| 盐源县| 文成县| 晋宁县| 剑川县| 前郭尔| 湟中县| 古蔺县| 正阳县| 辰溪县| 盖州市| 塔河县| 冕宁县| 巴中市| 桐柏县| 东乌珠穆沁旗| 长垣县| 南召县| 屏南县| 米易县| 九龙城区| 准格尔旗| 若羌县| 岑溪市| 突泉县|