node package manager
Easy sharing. Manage teams and permissions with one click. Create a free org »

autoroute-express-promise

Auto-route Express Promise

Summary

Auto-route Express Promise routing made simple with a single place to update.

Installation

Install with npm:

npm install --save autoroute-express-promise

Project Status

  • Beta
  • Active (June 26, 2015)

Example

Route Set Up

import {routes} from 'autoroute-express-promise'
import isUserAuthenticated = require('../controllers/auth/auth')
import express = require('express')
import withMessageAs = require('../utilities/response-structure')
 
var router = express.Router()
 
var authenticatedRoute = route => router.route(route).all(isUserAuthenticated)
 
routes({
        baseRoute: authenticatedRoute,
        response: (response, result) => response.send(withMessageAs(result)),
        message: (o) => {console.log(o.routeName, o.methodName)}
    }, ['./controllers/**/index.js'])
 
module.exports = router

Route/Controller Set Up

File Structure:

Note, that this is how I do my file structure. Any file structure is OK.

├── controllers/
    ├── api1/
    │   └── index.js
    ├── api2/
    │   └── index.js
    └── api3/
        └── index.js

Code Structure:

Note that you can do an array of routes also.

import {method} from 'autoroute-express-promise'
import {getPet, petDied} = require('../../pets')
 
const PETS = '/pets',
      ID = 'petId',
      PET = PETS + '/:' + ID
 
var routes: AutoRouteExpressPromise.RouteDefinition = {
    route: PET,
    methods: [
        [ method.get,       (req: Request) => getPet(req.params[ID]) ],
        [ method.delete,    (req: Request) => petDied(req.params[ID]) ] ]
}
 
export = routes

Cleaner nested route syntax (version 0.2):

var routes = {
    '/pets': {
        _methods: [
            [ method.post,      (req: Request) => getPet(req.body) ] ]
        ':id': [
            [ method.get,       (req: Request) => getPet(req.params[ID]) ],
            [ method.delete,    (req: Request) => petDied(req.params[ID]) ] ]
    },
    '/cats': {
        ':id': [
            [ method.get,       (req: Request) => getCat(req.params[ID]) ] ]
        '/hamsters': { // Overrides cats because of the forward slash at beginning 
            '/fish': [ // Overrides hamsters (hamsters bite) 
                [ method.get,   (req: Request) => getFish(req.params[ID])] ]
        }
    }
}

Example with two routes (this is the old way, you can still do it this way.):

import {method} from 'autoroute-express-promise'
import {getPet, newPet, petDied} = require('../../pets')
 
const PETS = '/pets',
      ID = 'petId',
      PET = PETS + '/:' + ID
 
var routes: AutoRouteExpressPromise.RouteDefinition[] = [
    { route: PETS,
      methods: [
          [ method.post,       (req: Request) => getPet(req.body) ] ]
    },
    { route: PET,
      methods: [
          [ method.get,        (req: Request) => getPet(req.params[ID]) ],
          [ method.delete,     (req: Request) => petDied(req.params[ID]) ] ]
    }
]
 
export = routes

API

import {routes, method} from 'autoroute-express-promise'

routes(options, glob[]):

where options:

{
    baseRoute: (routeName: string) => any
    message?: (options: {routeName: string; methodName: string}) => void
    response: (client: Express.Response, result: any) => any
}

baseRoute: (Required) Uses route name (e.g., /api/myroute/:id) and return an express.js Router. E.g.,

var router = express.Router
var authenticatedRoute = route => router.route(route).all(isUserAuthenticated)

message: (Optional) A function which passes the route name and method name (post, get, etc). Used for writing logs when route is called by server, e.g.,

o => {console.log(o.routeName, o.methodName)}

where: o is {routeName: '/api/myroute/:id', methodName: 'get'}.

response: (Required) Used to wrap the result in some wrapper and send method, e.g.,

(client, result) => client.send({result: result})

where glob:

List of globs as specified in require-glob. E.g., ['./controllers/**/index.js'].

method:

This is an enumeration of all the express.js methods:

get, post, put, head, delete, options, trace, copy, lock, mkcol, move, purge, propfind, proppatch, unlock, report, mkactivity, checkout, merge, "m-search", notify, subscribe, unsubscribe, patch, search, connect

E.g.,

method.get // => 0 
method[0] // => "get"