var http = require('http'); var koa = require('..'); var app = koa(); var data; // logger app.use(function(next){ return function *(){ var start = new Date; yield next; var ms = new Date - start; console.log('%s %s - %s', this.method, this.url, ms); } }); // response app.use(get('/', function *(){ if (data) { this.body = data; } else { this.body = 'POST to /'; } })); app.use(post('/', function *(){ data = yield buffer(this); this.status = 201; this.body = 'created'; })); function buffer(ctx) { return function(done){ var buf = ''; ctx.req.setEncoding('utf8'); ctx.req.on('data', function(chunk){ buf += chunk; }); ctx.req.on('end', function(){ done(null, buf); }); }; } function get(path, fn) { return route('GET', path, fn); } function post(path, fn) { return route('POST', path, fn); } function route(method, path, fn) { return function(next){ return function *() { var match = method == this.method && this.path == path; if (match) return yield fn; yield next; } } } http.createServer(app.callback()).listen(3000);