Fastify plugin to easily use postgres databases. WIP, mostly used in my personal projects
- 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)
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"
});
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 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
});
You can also use async fastify.database.query(text, params)
and async fastify.database.getClient()
and do stuff manually. Not recommended!
- 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