91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解nodejs微信公眾號開發——3.封裝消息響應模塊

發布時間:2020-09-07 03:04:25 來源:腳本之家 閱讀:255 作者:芒果屋里的貓 欄目:web開發

上一篇文章: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.replygenerator.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,里面充斥了大量的Promisegenaratoryield等內容,對ES6不了解的,可以學習一下此篇文章:ECMAScript6快速入手攻略

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

湘乡市| 绥宁县| 永丰县| 太白县| 灵寿县| 新宾| 郎溪县| 梅州市| 江永县| 南京市| 东丽区| 潼关县| 红安县| 怀宁县| 贵德县| 武陟县| 金塔县| 大石桥市| 简阳市| 乌兰察布市| 汉源县| 工布江达县| 昌乐县| 西乡县| 扎兰屯市| 西华县| 东乡族自治县| 安徽省| 安庆市| 泰顺县| 灯塔市| 沈阳市| 台北县| 屏边| 贵德县| 大英县| 齐齐哈尔市| 庆云县| 永昌县| 罗田县| 基隆市|