Problematic
The main reason for this post is types in prisma client for logs.
Issue preview
Default prisma service to use in nestjs
import { Injectable, OnModuleDestroy, OnModuleInit } from '@nestjs/common'
import { PrismaClient } from '@prisma/client'
@Injectable()
export class PrismaService
extends PrismaClient implements OnModuleInit, OnModuleDestroy
{
async onModuleDestroy() {
await this.$disconnect()
}
async onModuleInit() {
await this.$connect()
}
}
But what about logs...
Control logs
We can add a constructor with super call and control logs like:
constructor() {
super({
log: [
{ emit: 'event', level: 'query' },
{ emit: 'stdout', level: 'info' },
{ emit: 'stdout', level: 'warn' },
{ emit: 'stdout', level: 'error' },
],
errorFormat: 'pretty',
})
}
And we are faced with emit: event, so what does it mean in this case?
The default stdout just brings the message to the console and we no need to control it, but what with event?
Event
Event property is used for an event-based message approach. So in our case, we use an event to send an event and use a listener to catch the event and provide some log or even middleware.
Solution
We provide emit: event in the constructor to send events instead of sending them directly to the console.
And now we can catch our events like:
this.$on('query', (event) => {
this.logger.log(`[Duration]: ${event.duration} ms`)
this.logger.log(`[Timestamp]: ${event.timestamp}`)
this.logger.log(`[Query]: ${event.query}`)
})
And also we faced another error regarding types....
The argument of type '"query"' is not assignable to parameter of type 'never'.ts(2345)
Remember extends:
... PrismaService extends PrismaClient ...
there is no default generic for logs, so we need to add it:
PrismaClient<Prisma.PrismaClientOptions, Prisma.LogLevel>
and it's DONE!
Full code example: https://gist.github.com/lgtome/e05973fe289bef32ca5ccaa0247fe7ee

Top comments (0)