koa middleware call sequence test - dongyuwei/blog GitHub Wiki

var koa = require('koa');
var assert = require('assert');
var app = koa();

//see https://github.com/koajs/koa/blob/master/test/application.js#L73
var callStack = [];

app.use(function *(next){
  callStack.push(1);
  yield next;
  callStack.push(6);
});

app.use(function *(next){
  callStack.push(2);
  yield next;
  callStack.push(5);
});

app.use(function *(next){
  callStack.push(3);
  yield next;
  callStack.push(4);
});

app.use(function *(){
    this.body = yield getCallStackThunk();
});

function getCallStack(callback) {
    setTimeout(function() {
        console.log('before processed');
        assert.deepEqual(callStack, [1,2,3])

        callback(null, callStack);

        console.log('after processed');
        assert.deepEqual(callStack, [1,2,3,4,5,6])
    }, 0);
}

//see http://blog.stevensanderson.com/2013/12/21/experiments-with-koa-and-javascript-generators/
function getCallStackThunk() {
    return function(callback) {
        getCallStack(callback);
    };
}

app.listen(3000);