Skip to content

A plugin for Fastify to easily register Prisma Client in your Fastify instance

License

Notifications You must be signed in to change notification settings

sabinadams/fastify-prisma

Repository files navigation

Prisma + Fastify

Header

npm version Tests/Linting JavaScript Style Guide semantic-release

NPM

Installation

To use this package, first install it:

npm i @sabinthedev/fastify-prisma

Usage

In order to use this package, you will need Prisma set up in your project and Prisma Client generated. This plugin currently relies on Prisma Client being in node_modules/@prisma/client, (the default output location of the generated client).

import prismaPlugin from '@sabinthedev/fastify-prisma'
import Fastify from 'fastify'

const fastify = Fastify()

fastify.register(prismaPlugin)

fastify.get('/', async () => {
  // You will get nice intellisense here 👇🏻
  const users = await fastify.prisma.user.findMany()
  return { users }
})

fastify.listen({ port: 3000 }, (err, address) => {
  console.info(`⚡️ Server running at ${address}`)
})

You can also provide an object that contains Prisma Client's constructor arguments. For example, if you would like to manually set the datasource:

fastify.register(prismaPlugin, {
  datasources: {
    db: {
      url: 'file:./dev.db'
    }
  }
})

Caveats

There are a few caveats with this plugin which, at the moment, have no workarounds I am aware of:

Can't use a custom output directory for Prisma Client

In Prisma, you have the ability via the Prisma schema to change the output directory of the generated client, which defaults to node_modules/@prisma/client.

This plugin, however, relies on that client being in the default location.

Only a single Prisma Client can be used

You can set up different schemas in Prisma and generate Prisma Client for each schema. This requires using custom outputs, which is not supported in this plugin for the reason detailed above.

Prisma Client options may result in unexpected problems with typings & intellisense

Because the plugin has to look in the node_modules directory for Prisma Client and registers the prisma decorator with the type PrismaClient, certain actions that adjust the type of PrismaClient will not register correctly in the Fastify instance.

For example, while configuring logging in PrismaClient:

const prisma = new PrismaClient({
  log: [{ emit: 'event', level: 'info' }]
})

This will actually adjust the PrismaClient type and give you the ability to hook into events:

prisma.$on('info', (e) => {
  console.log(e)
})

Passing those logging configurations with this plugin will not adjust the type of the prisma decorator on the Fastify instance, resulting in a type error if you attempt to use the code above.

Just to clarify, this will affect any operation that adjusts the Prisma Client type.

Author

I'm Sabin Adams!

sabinthedev

Contributors

None yet! But contributions are welcome!

License

Licensed under MIT.

About

A plugin for Fastify to easily register Prisma Client in your Fastify instance

Resources

License

Stars

Watchers

Forks

Packages

No packages published