Define hapi.js routes with less code
JavaScript Makefile
Latest commit daf3a55 Oct 3, 2016 @rsp 0.1.8
Permalink
Failed to load latest commit information.
test
.gitignore
.travis.yml
LICENSE.md
Makefile
README.md
index.js
package.json

README.md

hapi.js helpers

npm install hapi-helpers
Build Status Test Coverage Code Climate Known Vulnerabilities Downloads

https://github.com/rsp/node-hapi-helpers (readme)

Some helper functions for hapi.js to write less boilerplate code.

Currently it only simplifies the routes definitions. Feature requests welcome via issues.

It has no dependencies - only some devDependencies (it uses chai, mocha, istanbul and coveralls for testing and test coverage, and Travis for continuous integration, see: https://travis-ci.org/rsp/node-hapi-helpers)

Example

You can write:

server.addRoutes([
    get('/a/{id}', getA),
    del('/a/{id}', delA),
    route('get put post delete', '/b', handleB)
]);

Instead of:

server.addRoutes([
    {
        method: 'GET',
        path: '/a/{id}',
        handler: getA
    },
    {
        method: 'DELETE',
        path: '/a/{id}',
        handler: delA
    },
    {
        method: ['GET', 'PUT', 'POST', 'DELETE'],
        path: '/b',
        handler: handleB
    }
]);

Installation

Install to use in your project, updating the dependencies in package.json:

npm install hapi-helpers --save

Usage

To use hh.get(), hh.post() etc:

var hh = require('hapi-helpers');

To use just get(), post() etc:

var hh = require('hapi-helpers'),
    get = hh.get, post = hh.post; // ...

Or using the ES6 destructuring assignment:

var {get, post} = require('hapi-helpers');

Routes

To simplify the definition of routes in hapi.js you can use:

hh.route(method, path, handler, config)

where config is optional and method can be a string or a list of strings e.g.:

  • 'GET'
  • 'get'
  • ['get', 'post']
  • 'get post'

You can use either 'del' or 'delete' for the DELETE method.

For example: hh.route('get post', path, handler, config)

It is a shortcut for:

{
    method: ['GET', 'POST'],
    path: path,
    handler: handler,
    config: config
}

hh.get(path, handler, config)

(config is optional) is a shortcut for:

{
    method: 'GET',
    path: path,
    handler: handler,
    config: config
}

hh.post(path, handler, config)

(config is optional) is a shortcut for:

{
    method: 'POST',
    path: path,
    handler: handler,
    config: config
}

hh.put(path, handler, config)

(config is optional) is a shortcut for:

{
    method: 'PUT',
    path: path,
    handler: handler,
    config: config
}

hh.patch(path, handler, config)

(config is optional) is a shortcut for:

{
    method: 'PATCH',
    path: path,
    handler: handler,
    config: config
}

hh.del(path, handler, config)

(config is optional) is a shortcut for:

{
    method: 'DELETE',
    path: path,
    handler: handler,
    config: config
}

Note: it is .del() and not .delete() because delete is a reserved word in JavaScript.

hh.options(path, handler, config)

(config is optional) is a shortcut for:

{
    method: 'OPTIONS',
    path: path,
    handler: handler,
    config: config
}

hh.all(path, handler, config)

(config is optional) is a shortcut for:

{
    method: '*',
    path: path,
    handler: handler,
    config: config
}

Real world example

Here is real world example, a route from hapi-example by Wyatt Preul:

var Types = require('hapi').types;

module.exports = [{
    method: 'GET',
    path: '/products',
    config: {
        handler: getProducts,
        validate: {
            query: {
                name: Types.String()
            }
        }
    }
}, {
    method: 'GET',
    path: '/products/{id}',
    config: {
        handler: getProduct
    }
}, {
    method: 'POST',
    path: '/products',
    config: {
        handler: addProduct,
        payload: 'parse',
        validate: {
            payload: {
                name: Types.String().required().min(3)
            }
        }
    }
}];

Here is the same using hapi-helpers, available on hapi-helpers-example:

var Types = require('hapi').types,
    hh = require('hapi-helpers'),
    get = hh.get,
    post = hh.post;

module.exports = [
    get('/products', getProducts, {
        validate: {
            query: {
                name: Types.String()
            }
        }
    }),
    get('/products/{id}', getProduct),
    post('/products', addProduct, {
        payload: 'parse',
        validate: {
            payload: {
                name: Types.String().required().min(3)
            }
        }
    })
];

The biggest difference is for simple routes like '/products/{id}' which is one simple line with hapi-helpers.

This is work in progress - more to come.

Issues

For any bug reports or feature requests please post an issue on GitHub.

Author

Rafał Pocztarski - https://github.com/rsp

License

MIT License (Expat). See LICENSE.md for details.