做了一个nest.js prisma模块,让prisma支持切面编程的精髓:监听器

开头先上正菜。安装方法:

bash 复制代码
pnpm i @nailyjs.nest.modules/prisma

没装Prisma的请先装:

bash 复制代码
pnpm i prisma @prisma/client

这俩是必须滴。

使用

和其他三方nest模块一样,参照README.md先从@nailyjs.nest.modules/prisma中导入PrismaModule到你的根模块中。

typescript 复制代码
import { Module } from '@nestjs/common';
import { PrismaModule } from '@nailyjs.nest.modules/prisma';

@Module({
  imports: [
    // 导入Prisma模块。如果不注册任何监听器,可以这么导入。
    PrismaModule.forRoot(),
  ],
})
export class AppModule {}

然后在任何地方都可以注入PrismaService和PrismaClient两个类了。

PrismaClient从@prisma/client包导入,监听器不会监听到PrismaClient发出的事件;PrismaService的基类就是PrismaClient,在PrismaClient的基础上实现了监听器的功能。

一般情况下,请使用PrismaService; 除非有特殊的需求,不想让监听器监听到,那就可以使用PrismaClient。

PrismaClient本来是不能被nest.js注入的,但是由于PrismaModule.forRoot()了,此时PrismaClient就是可以被注入的类了。可以很轻松地使用这俩类😜

撰写Service

typescript 复制代码
import { Injectable } from '@nestjs/common';
import { PrismaService } from '@nailyjs.nest.modules/prisma';

@Injectable()
export class AppService {
  constructor(
      // 这是能被监听器监听到的
      private readonly prismaService: PrismaService,
      // 这是不能的
      private readonly prismaClient: PrismaClient
  ) {}

  async findMany() {
    return this.prismaService.user.findMany();
  }
}

一个示例Subscriber

import语句我就不写了,懒得弄。看得懂就行。

typescript 复制代码
@Injectable()
export class PrismaListener {
  /**
   * 假设您有一个名为`user`的prisma模型,可以在这里注册一个监听器,监听`findMany`事件。
   * BeforeListen顾名思义,就是在`findMany`方法执行之前执行的方法。
   */
  @BeforeListen('user', 'findMany')
  public async beforeFindMany() {
    console.log('before findMany');
  }

  /**
   * AfterListen顾名思义,就是在`findMany`方法执行之后执行的方法。
   */
  @AfterListen('user', 'findMany')
  public async afterFindMany() {
    console.log('after findMany');
  }
}

BeforeListen和AfterListen从@nailyjs.nest.modules/prisma包导入。

写好了之后,还要注册到forRoot:

typescript 复制代码
@Module({
  imports: [
    PrismaModule.forRoot({
        subscribers: [PrismaListener]
    }),
  ],
})
export class AppModule {}

然后每次调用user表里的findMany方法时,都会先依次触发PrismaListener里的beforeFindMany方法,然后结束后再触发afterFindMany方法。

这样,就实现了切面的逻辑分离了。

这个包于2024年2月5日新鲜出炉,想上生产的都先等会()说不定有bug呢(自己玩一玩还是不错滴

相关推荐
hasty12 小时前
不上传新包,也能改变用户拿到的版本:npm dist-tag 的 OIDC 权限治理
前端·npm·node.js
福兮说1 天前
前后端算的 MD5、SHA-256 对不上?编码、换行、BOM、HMAC、JSON 顺序,八个原因逐个实测
前端·javascript·node.js·json·哈希算法
花旗蜕变1 天前
前端转 NestJS 全栈实践:从表单页面到微信业务系统
前端·typescript·nestjs
lingchen19061 天前
Node.js的下载安装配置
node.js
LRL_2 天前
【实战指南】Node.js 跨平台依赖下载:如何在 Windows/Linux 环境下互跨下载目标系统的 npm/pnpm 包
linux·windows·node.js
福兮说2 天前
URL 编码的七个坑:c++ 传到后端变空格、%25 套娃、截断 emoji 直接报错
开发语言·前端·javascript·node.js·url
liangshanbo12152 天前
Webpack vs Vite 底层原理高频追问的问题
前端·webpack·node.js
玖石书2 天前
HiSH 通过 apk 安装 Node.js、npm 与 pnpm
npm·node.js·鸿蒙·hish
池塘水悠悠2 天前
nodejs24安装(node.js安装)
node.js
LRL_2 天前
【K8s 存储】Longhorn v1.12.1 离线安装全流程:外网制作离线包 + 内网部署(附踩坑实录)
linux·windows·node.js