上一篇文章:nodejs微信公众号开发(2)自动回复,实现了简单的关注回复。采用拼接字符串的形式,并不是很方便,这里我们将其封装承接口。
<强> 1。ejs模板引擎强>
不使用拼接字符串的方式,那么模板引擎就是较好的选择.Nodejs开源模板的选择很多,程序中使用<代码> EJS> 代码,有<代码>经典ASP/PHP/JSP代码>的经验用起<代码> EJS> 代码来的确可以很自然,也就是说,你能够在<代码> & lt; %…%比;> 代码块中安排JavaScript代码,利用最传统的方式<代码> & lt; %=输出变量%祝辞> 代码(另外& lt; %——输出变量是不会对,等符号进行转义的)。
<强> 2。heredoc
强>
在php, python中都有heredoc方式的字符串定义方法,JavaScript也实现了heredoc模块,主要解决大量字符串拼接问题。
新建模板文件<代码> tpl.js 代码>:
使用严格的 var ejs=要求(“ejs”); var heredoc=要求(“heredoc”); var tpl=heredoc(函数(内容){/* & lt; xml> & lt; ToUserName> & lt; ! [CDATA [& lt; %=toUserName %祝辞]]祝辞& lt;/ToUserName> & lt; FromUserName> & lt; ! [CDATA [& lt; %=fromUserName %祝辞]]祝辞& lt;/FromUserName> & lt; CreateTime> & lt; %=createTime %祝辞& lt;/CreateTime> & lt; MsgType> & lt; ! [CDATA [& lt; %=msgType %祝辞]]祝辞& lt;/MsgType> & lt; %如果(msgType==='文本'){%比; & lt; Content> & lt; ! [CDATA [& lt;内容%=%祝辞]]祝辞& lt;/Content> & lt; %} else if (msgType==='图像'){%比; & lt; Image> & lt; MediaId> & lt; ! [CDATA [& lt; %=内容。mediaId %祝辞]]祝辞& lt;/MediaId> & lt;/Image> & lt; %} else if (msgType==='声音'){%比; & lt; Voice> & lt; MediaId> & lt; ! [CDATA [& lt; %=内容。mediaId %祝辞]]祝辞& lt;/MediaId> & lt;/Voice> & lt; %} %比;else if (msgType==='视频'){%比; & lt; Video> & lt; MediaId> & lt; ! [CDATA [& lt; %=内容。mediaId %祝辞]]祝辞& lt;/MediaId> & lt; Title> & lt; ! [CDATA [& lt; %=内容。标题%祝辞]]祝辞& lt;/Title> & lt; Description> & lt; ! [CDATA [& lt; %=content.description %祝辞]]祝辞& lt;/Description> & lt;/Video> & lt; %} %比;else if (msgType==='音乐'){%比; & lt; Music> & lt; Title> & lt; ! [CDATA [& lt; %=内容。标题%祝辞]]祝辞& lt;/Title> & lt; Description> & lt; ! [CDATA [& lt; %=content.description %祝辞]]祝辞& lt;/Description> & lt; MusicUrl> & lt; ! [CDATA [& lt; %=内容。musicUrl %祝辞]]祝辞& lt;/MusicUrl> & lt; HQMusicUrl> & lt; ! [CDATA [& lt; %=内容。hqMusicUrl %祝辞]]祝辞& lt;/HQMusicUrl> & lt; ThumbMediaId> & lt; ! [CDATA [& lt; %=内容。thumbMediaId %祝辞]]祝辞& lt;/ThumbMediaId> & lt;/Music> & lt; %} %比;else if (msgType==='新闻'){%比; & lt; ArticleCount> & lt; %=内容。长度%祝辞& lt;/ArticleCount> & lt; Articles> & lt; % content.forEach(函数(项){%比; & lt; item> & lt; Title> & lt; ! [CDATA [& lt; %=项目。标题%祝辞]]祝辞& lt;/Title> & lt; Description> & lt; ! [CDATA [& lt; %=item.description %祝辞]]祝辞& lt;/Description> & lt; PicUrl> & lt; ! [CDATA [& lt; %=项目。picUrl %祝辞]]祝辞& lt;/PicUrl> & lt; Url> & lt; ! [CDATA [& lt; %=项目。%在url]]祝辞& lt;/Url> & lt;/item> & lt; %}) %比; & lt;/Articles> & lt; %} %比; & lt;/xml> */}); var=ejs.compiled编译(tpl); 出口=模块。出口={ 编译:编译 }; >之前<强> 3。处理接收到的消息强>
修改<代码> generator.js> 代码中之前直接回复消息的那部分代码,我们将处理回复内容的逻辑交给业务层,等其处理完毕,继续执行下面的代码,封装消息内容成xml并回复出去。
var消息=util.formatMessage (xml); 这一点。weixin=消息;//挂载消息 收益率handler.call(下);//转到业务层逻辑 wechat.replay.call(这个);//真正回复 >之前<>强4。业务层的处理逻辑强>
<代码> app.js> 代码里面中间件的使用方式修改为:
var weixin=要求('/weixin。'); … app.use(微信(config.wechat weixin.reply));>之前<代码> weixin.reply> 代码即<代码> generator.js> 代码中的<代码>处理程序> 代码,我们将公众号业务成的逻辑都写在<代码> weixin.js> 代码里面,如回复消息,将来的爬取电影网站信息,支付等。
详解nodejs微信公众号开发,3。封装消息响应模块