Simple asynchronous middleware pattern.
npm install throwback --save
Compose asynchronous (promise-returning) functions.
const { compose } = require("throwback");
const fn = compose([
  async function(ctx, next) {
    console.log(1);
    try {
      await next();
    } catch (err) {
      console.log("throwback", err);
    }
    console.log(4);
  },
  async function(ctx, next) {
    console.log(2);
    return next();
  }
]);
// Callback runs at the end of the stack, before
// the middleware bubbles back to the beginning.
fn({}, function(ctx) {
  console.log(3);
  ctx.status = 404;
});Tip: In development (NODE_ENV !== "production"), compose will throw errors when you do something unexpected. In production, the faster non-error code paths are used.
Build a micro HTTP server!
const { createServer } = require("http");
const finalhandler = require("finalhandler"); // Example only, not compatible with single `ctx` arg.
const { compose } = require("throwback");
const app = compose([
  function({ req, res }, next) {
    res.end("Hello world!");
  }
]);
createServer(function(req, res) {
  return app({ req, res }, finalhandler());
}).listen(3000);Built for servie and inspired by koa-compose.
MIT