wechat-bot
Version:
middleware framework for creating wechat bot
89 lines (72 loc) • 1.85 kB
JavaScript
var debug = require('debug')('wechat:bot');
var app = module.exports = {};
var env = process.env.NODE_ENV || 'development';
app.use = function use(route, fn) {
// default route to empty object
if (typeof(route) !== 'object') {
fn = route;
route = {};
}
// wrap sub-apps
if (typeof(fn.handle) === 'function') {
var subApp = fn;
fn.route = route;
fn = function (req, res, next) {
subApp.handle(req, res, next);
};
}
debug('use %s %s', route.name || '{}', fn.name || 'anonymous');
this.stack.push({route: route, handle: fn});
return this;
};
app.handle = function (req, res, out) {
var stack = this.stack;
var index = 0;
function next(err) {
var layer;
// next layer
layer = stack[index++];
// all done
if (!layer || res.headersSent) {
// delegate to parent
if (out) return out(err);
// un-handled error
if (err) {
debug('oops');
// basic error for production
var msg = env === 'production' ? 'oops' : err.stack || err.toString();
// log to stderr in a non-test env
if (env !== 'test') console.error(err.stack || err.toString());
res.reply({
type: 'text',
content: msg
});
} else {
debug('no handler');
res.reply({
type: 'text',
content: 'pardon'
});
}
return;
}
try {
debug('%s %s', layer.handle.name || 'anonymous', layer.route.name || '{}');
var arity = layer.handle.length;
if (err) {
if (arity === 4) {
layer.handle(err, req, res, next);
} else {
next(err);
}
} else if (arity < 4) {
layer.handle(req, res, next);
} else {
next();
}
} catch (e) {
next(e);
}
}
next();
};