Skip to content

Instantly share code, notes, and snippets.

@grabbou
Last active March 24, 2017 02:13
Show Gist options
  • Save grabbou/ead3e217a5e445929f14 to your computer and use it in GitHub Desktop.
Save grabbou/ead3e217a5e445929f14 to your computer and use it in GitHub Desktop.
How to use ES6 generators with Hapi.js <3
import co from 'co'
// Generator controller,
// this.models refers to Sequelize models added with server.bind()
function* loginController(request) {
let user = yield this.models.User.find({
where: {
email: request.payload.email
}
});
if (!user)
yield Promise.reject(Boom.notFound('USER_NOT_FOUND'));
return user.toJSON();
}
// Wraps generator so it can be used in Hapi responses
function wrapGen(generator) {
let handler = co.wrap(generator);
return function(request, reply) {
handler.bind(this)(request, reply)
.then(reply)
.catch(reply);
};
}
// Here's the most typical Hapi.js route
server.route({
method: 'POST',
path: '/auth/login',
handler: wrapGen(loginController)
});
@ebertmi
Copy link

ebertmi commented Mar 20, 2016

With newer co versions the wrapping is even easier.

Just use

import co from 'co';

// Wraps generator so it can be used in Hapi Route Handlers
function generoute(generator) {
  return co.wrap(generator);
}

export default generoute;

This allows to use a generator handler with request and reply.

function* myHandler (request, reply) {
  try {
    let user =  yield DB.getUser(request.params.id);
    ...
    reply(user);
  } catch (e) {
    reply({
       customErrorMessage: 'All your base are belong to us!'
    }).code(400);
  }
}

This allows to set the HTTP response codes, etc.

@noveogroup-amorgunov
Copy link

I wrote small plugin for this: noveogroup-amorgunov/hapi-generoutify

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment