use(fn) { if (typeof fn !== 'function') thrownewTypeError('middleware must be a function!'); if (isGeneratorFunction(fn)) { deprecate('Support for generators will be removed in v3. ' + 'See the documentation for examples of how to convert old middleware ' + 'https://github.com/koajs/koa/blob/master/docs/migration.md'); fn = convert(fn); } debug('use %s', fn._name || fn.name || '-'); this.middleware.push(fn); returnthis; }
functioncompose (middleware) { if (!Array.isArray(middleware)) thrownewTypeError('Middleware stack must be an array!') for (const fn of middleware) { if (typeof fn !== 'function') thrownewTypeError('Middleware must be composed of functions!') }
returnfunction (context, next) { // last called middleware # let index = -1 returndispatch(0) functiondispatch (i) { if (i <= index) returnPromise.reject(newError('next() called multiple times')) index = i let fn = middleware[i] if (i === middleware.length) fn = next if (!fn) returnPromise.resolve() try { returnPromise.resolve(fn(context, functionnext () { returndispatch(i + 1) })) } catch (err) { returnPromise.reject(err) } } } }