node package manager
Share your code. npm Orgs help your team discover, share, and reuse code. Create a free org »

http-middleware-metalab

http-middleware-metalab

Minimalist, composable http middleware pack for http/express/hapi.

build status coverage license version downloads

Packs

  • base - Some sensible defaults.
  • webpack - For serving assets from webpack-based projects.
  • react - Server-side rendering with react and redux.

Usage

Install http-middleware-metalab and add it to your package.json file:

npm install --save http-middleware-metalab

These middleware components are NOT the same as express middleware; they are conceptually designed in a manner more similar to redux stores. Every middleware is an object with properties corresponding to events on an http.Server object; e.g. request, error, upgrade, etc. Each middleware function takes an existing middleware object and composes it.

For example, adding a req.message field:

function addMessage(message) {
  // Take in the existing middleware here 
  return (middleware) => {
    const { request } = middleware;
    // Return a new middleware here. 
    return {
      ...middleware,
      request(req, res) {
        req.message = message;
        // Composition! 
        request(req, res);
      },
    };
  };
}
 
// Create the composed middleware. 
const app = addMessage('hello')({
  // Your "base" middleware. 
  request(req, res) {
    res.statusCode = 200;
    res.end(`Message: ${req.message}`);
  }
});
 
// Create the server and use the appropriate methods on the middleware object. 
const server = http.createServer();
server.on('request', app.request);
server.listen();

In that sense http middleware is even less opinionated than express middleware. It is merely a composition mechanism for a previously non-composable set of functions (http server events).

With http

import http from 'http';
import connect from 'http-middleware-metalab/adapter/http';
import base from 'http-middleware-metalab/base';
 
const server = http.createServer();
const createApp = base();
const app = createApp({
  request(req, res) {
    res.statusCode = 200;
    res.end(`Hello ${req.id}`);
  },
  error(err) {
    console.log('GOT ERROR', err);
  },
});
 
connect(app, server).listen(8080);

With express

import express from 'express';
import connector from 'http-middleware-metalab/adapter/express';
import base from 'http-middleware-metalab/base';
 
const createMiddleware = base();
const app = express();
 
app.use(connector(createMiddleware));
app.listen(8080);

With hapi

import { Server } from 'hapi';
import connector from 'http-middleware-metalab/adapter/hapi';
import base from 'http-middleware-metalab/base';
 
const createMiddleware = base();
const server = new Server();
 
server.connection({ port: 8080 });
server.ext(connector(createMiddleware));
server.start();