A model layer for hapi integrating Objection ORM
Clone or download
devinivy Merge pull request #61 from rickerd/patch-1
API.md micro minor typo
Latest commit 3facd87 Oct 17, 2018



A hapi plugin integrating Objection ORM

Build Status Coverage Status Security Status

Lead Maintainer - Devin Ivy


See also the API Reference

Schwifty is used to define Joi-compatible models and knex connections for use with Objection ORM. Those models then become available within your hapi server where it is most convenient. It has been tailored to multi-plugin deployments, where each plugin may set clear boundaries in defining its own models, knex database connections, and migrations. It's safe to register schwifty multiple times, wherever you'd like to use it, as it protects against model name collisions and other ambiguous configurations.

Note, this library is intended to work with hapi v17+ and Objection v1 (see peerDependencies in our package.json).

Schwifty v4 introduced compatibility with Objection v1. If you prefer or need to work with earlier versions of Objection, checkout Schwifty v3 instead!

// First, ensure your project includes knex, objection, and sqlite3

// To get started you might run,
// npm install --save hapi joi schwifty knex objection sqlite3

'use strict';

const Hapi = require('hapi');
const Joi = require('joi');
const Schwifty = require('schwifty');

(async () => {

    const server = Hapi.server({ port: 3000 });

        method: 'get',
        path: '/dogs/{id}',
        handler: async (request) => {

            const { Dog } = request.models();

            return await Dog.query().findById(request.params.id);

    await server.register({
        plugin: Schwifty,
        options: {
            knex: {
                client: 'sqlite3',
                useNullAsDefault: true,
                connection: {
                    filename: ':memory:'

    // Register a model with schwifty...

        class Dog extends Schwifty.Model {
            static get tableName() {

                return 'Dog';

            static get joiSchema() {

                return Joi.object({
                    id: Joi.number(),
                    name: Joi.string()

    await server.initialize();

    // ... then make a table ...

    const knex = server.knex();

    await knex.schema.createTable('Dog', (table) => {


    // ... then add some records ...

    const { Dog } = server.models();

    await Promise.all([
        Dog.query().insert({ name: 'Guinness' }),
        Dog.query().insert({ name: 'Sully' }),
        Dog.query().insert({ name: 'Ren' })

    // ... then start the server!

    await server.start();

    console.log(`Now, go find some dogs at ${server.info.uri}!`);