hapi-auto-handler

2.0.0 • Public • Published

hapi-auto-handler Build Status

Hapi plugin that makes it easy to write route handlers that perform complex asynchronous processing flows.

Background

The async library is a popular module for working with asynchronous JavaScript. One of the most powerful methods it provides is async.auto, which lets you describe and execute complex parallel dependency graphs with one easy-to-read JavaScript object. This plugin makes it simple to incorporate async.auto (and its cousin async.autoInject) into your hapi route handlers and return the results to the caller.

Install

npm install hapi-auto-handler

Use (auto mode)

const Hapi = require('hapi');
const server = new Hapi.Server({});

server.register({
  register: require('hapi-auto-handler'),
  options: {}
}, () => {
  server.route({
    path: '/example/{theInput}',
    method: 'GET',
    handler: {
      // hapi-auto-handler recognizes the 'auto' keyname and will generate the route handler for you:
      auto: {
        first: (done) => {
          done(null, 'first');
        },
        second: (done) => {
          done(null, 'second');
        },
        // third only runs after first and second are done:
        third: ['first', 'second', (results, done) => {
          done(null, results.first + results.second);
        }],
        // make your method depend on 'request' to access the request object:
        fourth: ['third', 'request', 'reply', (results, done) => {
          // results.request is now the request object:
          reply(null, results.third + results.request.params.theInput)
          done();
        }]
      }
    }
  });
});

Use (autoInject mode)

const Hapi = require('hapi');
const server = new Hapi.Server({});

server.register({
  register: require('hapi-auto-handler'),
  options: {}
}, () => {
  server.route({
    path: '/example/{theInput}',
    method: 'GET',
    handler: {
      // hapi-auto-handler recognizes the 'autoInject' keyname and will generate the route handler for you:
      autoInject: {
        first(done) {
          done(null, 'first');
        },
        second(done) {
          done(null, 'second');
        },
        // third only runs after first and second are done:
        third(first, second, done) {
          done(null, first + second);
        },
        // make your method depend on 'request' to access the request object:
        final(third, request, reply, done) {
          // request is now the request object:
          reply(null, third + request.params.theInput);
          done();
        }
      }
    }
  });
});

Features:

Special Dependencies

  • settings: can be specified in the dependency list for a method to make the hapi server.settings.app object available inside the method:
  server.settings.app.value1 = 'hey'
  ...
  getSettingsStuff: ['settings', (results, done) => {
    const settings = results.settings.app.value1;
  }]
  ...
  • request: can be specified in the dependency list for a method to make the hapi request object available inside the method:
...
  getRequestStuff: ['request', (results, done) => {
    const request = results.request;
    const userName = request.query.firstName + ' ' + request.query.lastName;
    done(null, userName);
  }]
  ...
  • server: can be specified in the dependency list for a method to make the hapi server object available inside the method:
...
  getServerStuff: ['server', (results, done) => {
    const server = results.server;
    const serverName = server.info.id + '@' + server.info.host + ':'' + server.info.port'
    done(null, serverName);
  }]
  ...
  • reply: can be specified in the dependency list for a method. Anything passed to that gets send back to the client.
...
  finished(reply, done) => {
    // this route will always respond with "Hello World!"
    reply(null, "Hello World!");
    done();
  }
  ...

Readme

Keywords

Package Sidebar

Install

npm i hapi-auto-handler

Weekly Downloads

1

Version

2.0.0

License

MIT

Last publish

Collaborators

  • jga
  • dawnerd
  • ecwillis
  • orthagonal1
  • alaguna
  • aleperez92