co-wechat-body
Version:
Wechat xml mesage body parser for koa.
58 lines (50 loc) • 1.46 kB
JavaScript
;
const debug = require('debug')('co-wechat-body')
const xmlParser = require('koa-xml-body').default;
module.exports = (options) => {
return function* wechatXmlParser(next) {
if(isBodyParsed(this.request.body)){
debug('body already parsed: %j', this.request.body);
return yield next;
}
// parse it
debug('parse wechat body...');
delete this.request.body;
yield xmlParser(options).call(this, formater.call(this, next));
}
};
function isBodyParsed(body){
return body && Object.keys(body).length > 0;
}
function* formater(next) {
// this.request.body is parsed from koa-xml-body
if(this.request.body && this.request.body.xml){
this.request.body = formatMessage(this.request.body.xml);
}
debug('parse finish, the body is: %j', this.request.body);
yield next;
}
function formatMessage(result) {
const message = {};
if (typeof result === 'object') {
for (let key in result) {
if (!(result[key] instanceof Array) || result[key].length === 0) {
continue;
}
if (result[key].length === 1) {
let val = result[key][0];
if (typeof val === 'object') {
message[key] = formatMessage(val);
} else {
message[key] = (val || '').trim();
}
} else {
message[key] = [];
result[key].forEach( (item) => {
message[key].push(formatMessage(item));
});
}
}
}
return message;
}