>웹 프론트엔드 >JS 튜토리얼 >Node.js+Koa 개발 응답 이벤트 예시

Node.js+Koa 개발 응답 이벤트 예시

零下一度
零下一度원래의
2017-06-25 09:15:111570검색

위챗 공식 계정의 이벤트에는 구독 이벤트/코드 스캔 이벤트/클릭 이벤트/점프링크 이벤트 등이 포함됩니다. 자세한 내용은 설명서를 참조하세요.

여기에서 구독 이벤트를 구현해 보겠습니다. 다른 이벤트의 구현 과정도 비슷합니다.

누군가 공식 계정을 구독하면 WeChat 서버가 이벤트를 우리 서버에 푸시합니다. 이 이벤트는 XML 형식의 데이터 패킷입니다.

1. 인덱스 라우팅에 따라 이벤트 후 응답을 구현합니다.

WeChat이 서버에 메시지를 푸시하면 메시지가 여기에 먼저 전달된다는 점을 이해하실 수 있습니다.

/routes/index.js 추가됨:

router.post('/', index_middleware.post(config.wechat));

2. index_middleware에서 post 메소드를 구현합니다.

는 WeChat 서버에서 서버로의 게시물 요청을 처리하는 방법입니다.

일반적인 프로세스는 먼저 WeChat 서버에서 보낸 데이터 패킷을 수신한 다음 XML 데이터 패킷을 구문 분석한 다음 수신된 데이터를 기반으로 서버에서 논리적 처리를 수행하여 XML 형식의 응답 메시지를 형성하는 것입니다.

/wechat/index_middleware.js 추가됨:

exports.post = function(opts) {return function *(next) {var token = opts.token;var signature = this.query.signature;var nonce = this.query.nonce;var timestamp = this.query.timestamp;var echostr = this.query.echostr;var str = [token, timestamp, nonce].sort().join('');var sha = sha1(str);if (sha !== signature) {this.body = 'wrong';return false;
        }var data = yield getRawBody(this.req, {
            length: this.length,
            limit: '1mb',
            encoding: this.charset
        });var message = yield util.parseXMLAsync(data);var xml = yield autoReply(message.xml, wechat);
        console.log(message);
        console.log(xml);this.status = 200;this.type = 'application/xml';this.body = xml;
    };
};

여기의 데이터는 raw-body 구성 요소를 사용하여 우리가 받은 데이터 패킷입니다. 동시에 도구 기능인 util과 사용자 정의 기능인 autoReply가 사용됩니다.

따라서 /wechat/index_middleware.js에 다음 코드를 추가해야 합니다.

var getRawBody = require('raw-body');var util = require('./util');var autoReply = require('./autoReply');

3. util 도구 함수에서 parsXMLAsync 메서드를 구현합니다. 이 메서드의 기능은 xml을 json 데이터로 비동기적으로 형식화하는 것입니다.

/wechat/util.js:

var fs = require('fs');var xml2js = require('xml2js');

exports.parseXMLAsync = function(xml) {return new Promise(function(resolve, reject) {
        xml2js.parseString(xml, {
            trim: true,
            explicitArray: false}, function(err, content) {if (err) {
                reject(err);
            }
            resolve(content);
        });
    });
};

여기에서는 xml2js 구성 요소가 사용됩니다.

4. 자동 응답 기능을 구현합니다. 해당 기능은 WeChat 서버에서 보낸 데이터 패킷을 논리적으로 처리하여 WeChat에 보내는 데 필요한 XML 형식 데이터를 구성하는 것입니다.

/wechat/autoReply.js:

var createXML = require('./createXML');function autoReply(message, wechat) {if (message.MsgType === 'event') {if (message.Event === 'subscribe') {if (message.EventKey) {
                console.log('扫码进入');
            }var now = new Date().getTime();return Promise.resolve(createXML({
                ToUserName: message.FromUserName,
                FromUserName: message.ToUserName,
                MsgType: 'text',
                Content: 'Hello!!'}));
        }else if (message.Event === 'unsubscribe') {
            console.log('取关');return Promise.resolve('');
        }
    }
}

여기에서는 팔로우 및 언팔로우 이벤트만 구현되며 createXML 기능도 사용됩니다. 해당 기능은 데이터를 xml 형식(

/wechat/createXML)으로 캡슐화하는 것입니다. js :

function createXML(messageObj) {var { ToUserName, FromUserName, MsgType = 'text'} = messageObj;var CreateTime = new Date().getTime();var header = `<xml>
                    <ToUserName><![CDATA[${ToUserName}]]></ToUserName>
                    <FromUserName><![CDATA[${FromUserName}]]></FromUserName>
                    <CreateTime>${CreateTime}</CreateTime>
                    <MsgType><![CDATA[${MsgType}]]></MsgType>`;var content = '';switch(MsgType) {case 'text':var { Content } = messageObj;
            content = `<Content><![CDATA[${Content}]]></Content>
                     </xml>`;break;case 'image':var { MediaId }  = messageObj;
            content = `<Image>
                         <MediaId><![CDATA[${MediaId}]]></MediaId>
                       </Image>
                     </xml>`;break;case 'voice':var { MediaId } = messageObj;
            content = `<Voice>
                         <MediaId><![CDATA[${MediaId}]]></MediaId>
                       </Voice>
                     </xml>`;break;case 'video':var { MediaId, Title, Description } = messageObj;
            content = `<Video>
                         <MediaId><![CDATA[${MediaId}]]></MediaId>
                         <Title><![CDATA[${Title}]]></Title>
                         <Description><![CDATA[${Description}]]></Description>
                       </Video> 
                     </xml>`;break;case 'music':var { Title, Description, MusicUrl, HQMusicUrl, ThumbMediaId } = messageObj;
            content = `<Music>
                         <Title><![CDATA[${Title}]]></Title>
                         <Description><![CDATA[${Description}]]></Description>
                         <MusicUrl><![CDATA[${MusicUrl}]]></MusicUrl>
                         <HQMusicUrl><![CDATA[${HQMusicUrl}]]></HQMusicUrl>
                         <ThumbMediaId><![CDATA[${ThumbMediaId}]]></ThumbMediaId>
                       </Music>
                     </xml>`;break;case 'news':var { Articles } = messageObj;var ArticleCount = Articles.length;
            content = `<ArticleCount>${ArticleCount}</ArticleCount><Articles>`;for (var i = 0; i < ArticleCount; i++) {
                content += `<item>
                                <Title><![CDATA[${Articles[i].Title}]]></Title>
                                <Description><![CDATA[${Articles[i].Description}]]></Description>
                                <PicUrl><![CDATA[${Articles[i].PicUrl}]]></PicUrl>
                                <Url><![CDATA[${Articles[i].Url}]]></Url>
                              </item>`;            }
            content += '</Articles></xml>';break;default:
            content = `<Content><![CDATA[Error]]></Content>
                     </xml>`;    }    var xml = header + content;return xml;
}

module.exports = createXML;

위 작업을 완료한 후 서버를 시작하고 다시 공식 계정을 팔로우하면 Hello! ! 정보.

이러한 방식으로 우려되는 이벤트 처리가 실현됩니다.

위 내용은 Node.js+Koa 개발 응답 이벤트 예시의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.