Skip to content
Branch: master
Go to file
Clone

Files

Permalink
Failed to load latest commit information.

README.md

fastify-postgres

Fastify plugin to easily use postgres databases. WIP, mostly used in my personal projects

Features

  • Automatic handling of aquiring / releasing clients
  • Named parameters (Modified from node-postgres-named),
  • Tracking of unreleased clients (When a client stays open for more than 5 secs)

Installation

This is NOT an npm package (I'm too lazy, feel free to make one)! Simply include this repo as a submodule into your module, add the required dependencies (pg, pg-native and lodash) and load the plugin:

fastify.register(require("./path_to_submodule/plugin.js"), {
    url: "postgres://...",

    // Additional optional parameters and their defaults:
    maxConnections: 20,
    connectionTimeout: 5000,
    keepAlive: true,

    // How to decorate fastify, i.e. this results in fastify.database
    decoratorName: "database",

    // How to decorate the request object, by default the client will be available as "request.dbClient"
    requestDecoratorName: "dbClient"
});

Usage

It is highly recommended to use the decorators provided by this plugin. They will take care of aquiring / releasing the database client and decorate the request with a property dbClient.

fastify.get("/", {

    // This takes care of populating request.dbClient
    preHandler: fastify.database.requireDbClient()

}, async (request, reply) => {

    // Issue query, named parameters are recommended
    const query = await request.dbClient.query(`
        select * from sometable where id = ~id
    `, { id: 5 });

    if (query.rowCount !== 1) {
        // Client will automatically be released
        reply.status(500);
        return;
    }

    // Same here, after the method returns the client will get released
    return {
        result: query.rows[0]
    }
});

Transactions

Transactions are supported:

fastify.get("/", {

    // This takes care of populating request.dbClient
    preHandler: fastify.database.requireDbClient()

}, async (request, reply) => {

    // Start transaction
    await request.dbClient.asyncBeginTransaction();

    // Issue query
    const query = await request.dbClient.query(`select * from sometable where id = ~id`, { id: 5 });

    // ...Do something ...
    
    // throw err("xxx);
    // ^ If an error is thrown anywhere in the handler, the transaction will be automatically
    // get a rollback and the client will get released


    // Commit transaction
    await request.dbClient.asyncCommitTransaction();

    // Again, client will automatically get released

});

Custom usage

You can also use async fastify.database.query(text, params) and async fastify.database.getClient() and do stuff manually. Not recommended!

Caveeats

  • Calls process.exit(-1) if connection to database fails, probably throw an error instead, but for my projects its assumed that if the database is unavailable, the server is pretty useless

About

Fastify plugin to easily use postgres databases

Resources

Releases

No releases published
You can’t perform that action at this time.