This plugin takes Bookshelf.js models that are returned via Hapi's reply
method and serializes them using a user-defined serialize
method.
const Hapi = require('@hapi/hapi');
const server = new Hapi.Server();
await server.register([
require('hapi-bookshelf-serializer'),
]);
Models are defined just like all Bookshelf.js models, except for one small addition. A serialize
function is added with the following signature function (request) { }
. All model properties can be accessed in the serialize
function via this.get()
and the function will be passed the current Hapi request as request
. The serialize
function can either return a static value or a Promise
.
Currently there is no support in this module for automatically serializing all related models so you will need to call the function manually.
// models/role.js
const bookshelf = require('bookshelf')(require('knex')(config));
module.exports = bookshelf.Model.extend({
tableName: 'roles',
serialize: function(request) {
return {
this.get('id'),
this.get('name')
};
}
});
// models/user.js
const bookshelf = require('bookshelf')(require('knex')(config));
const Role = require('./role.js');
module.exports = bookshelf.Model.extend({
tableName: 'users',
roles: this.belongsToMany(Role),
serialize: function (request) {
return {
this.get('id'),
this.get('email'),
roles: this.related('roles').map(function (role) {
return role.serialize(request);
});
};
}
});
This plugin pairs well with the hapi-bookshelf-models plugin which makes registering models from a directory super easy.