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

上一篇文章:nodejs微信公衆號開發(2)自動回覆,實現了簡單的關注回覆。採用拼接字符串的形式,並非很方便,這裏咱們將其封裝承接口。(項目github地:https://github.com/Panfen/wem... )php

1. ejs模板引擎

不使用拼接字符串的方式,那麼模板引擎就是較好的選擇。Nodejs開源模板的選擇不少,程序中使用 EJS,有Classic ASP/PHP/JSP的經驗用起EJS來的確能夠很天然,也就是說,你可以在 <%...%> 塊中安排 JavaScript 代碼,利用最傳統的方式 <%=輸出變量%>(另外 <%-輸出變量是不會對 & 等符號進行轉義的)。
EJS 模板快速入門node

2. heredoc

在php、python中都有heredoc方式的字符串定義方法,JavaScript也實現了heredoc模塊,主要解決大量字符串拼接問題。
新建模板文件tpl.js:python

'use strict'

var ejs = require('ejs');
var heredoc = require('heredoc');

var tpl = heredoc(function(){/*
    <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.compile(tpl);

exports = module.exports = {
    compiled:compiled
};

3. 處理接收到的消息

修改generator.js中以前直接回復消息的那部分代碼,咱們將處理回覆內容的邏輯交給業務層,等其處理完畢,繼續執行下面的代碼,封裝消息內容成xml並回復出去。git

var message = util.formatMessage(content.xml);
        
this.weixin = message;  //掛載消息

yield handler.call(this,next);   //轉到業務層邏輯

wechat.replay.call(this);  //真正回覆

4.業務層的處理邏輯

app.js裏面中間件的使用方式修改成:es6

var weixin = require('./weixin');
...
app.use(wechat(config.wechat,weixin.reply));

weixin.replygenerator.js中的handler,咱們將公衆號業務成的邏輯都寫在weixin.js裏面,如回覆消息、未來的爬取電影網站信息、支付等。github

exports.reply = function* (next){
    var message = this.weixin;

    if(message.MsgType === 'event'){
        if(message.Event === 'subscribe'){
            if(message.EventKey) console.log('掃描二維碼關注:'+message.EventKey+' '+message.ticket);
            this.body = '終於等到你,還好我沒放棄';
        }else if(message.Event === 'unsubscribe'){
            this.body = '';
            console.log(message.FromUserName +' 悄悄地走了...');
        }
    }else{
        //
    }

    yield next;
}

5.回覆消息

咱們在Wechat原型鏈上增長replay方法:segmentfault

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); 的回覆消息功能。咱們打印一下this.body的內容:
圖片描述微信

6.總結

上面代碼已經基本實現了消息的封裝,回覆規則和回覆內容寫在業務層代碼weixin.js中,裏面簡單的實現了關注和取關的事件處理。
因爲koa框架是基於ES6,裏面充斥了大量的Promisegenaratoryield等內容,對ES6不瞭解的,能夠學習一下阮一峯的著做:《ECMAScript 6 入門》app

相關文章
相關標籤/搜索