Skip to content

Instantly share code, notes, and snippets.

@nmors
Created October 31, 2018 21:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nmors/247d0c52f593ff6048ed18993a8f4930 to your computer and use it in GitHub Desktop.
Save nmors/247d0c52f593ff6048ed18993a8f4930 to your computer and use it in GitHub Desktop.
Express App Composition (The functional programming way)
const Express = require('express')
const _ = require('lodash-fp')
const { userController, userMessagesController, postController, pagesController } = require('./controllers')
const { middleware1, middleware2, errorHandler } = require('./middlewares')
const use = (...middleware) => app => app.use(...middleware)
const setupRoute = _.curry((verb, method, urlParams, resource, controller, app) => app[verb](resource + urlParams, controller[method]))
const routeGroup = _.curry((endpoints, resource, controller, app) => {
endpoints.map(x => x(resource, controller, app))
return app
})
const _getAll = setupRoute('get', 'getAll', '')
const _post = setupRoute('post', 'new', '')
const _update = setupRoute('put', 'update', `/:id`)
const _delete = setupRoute('delete', 'delete', `/:id`)
const _get = setupRoute('get', 'get', `/:id`)
const rwEndpoints = routeGroup([ _getAll, _get, _post, _update, _delete ])
const roEndpoints = routeGroup([ _getAll, _get ])
const composeApp = _.flow(
use(middleware1),
use(middleware2),
rwEndpoints('/user/message', userMessagesController),
rwEndpoints('/user', userController),
rwEndpoints('/posts', postController),
roEndpoints('/pages', pagesController),
use(errorHandler),
)
const app = composeApp(Express())
app.listen(3000, () => console.log('Example app listening on port 3000!'))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment