【问题标题】:ExpressJS / MYSQL / Prisma - Save DB' entities changesExpressJS / MYSQL / Prisma - 保存 DB' 实体更改
【发布时间】:2022-01-21 13:54:51
【问题描述】:

我正在寻找一种方法来保存某些实体的数据库实体更改。我的意思是我需要在数据库表中保存对某些表所做的所有更改(添加、修改/删除),并能够跟踪进行更改的用户。

如果我使用 Prisma 作为 ORM,我正在使用自定义 ExpressJS 服务器和 MYSQL 数据库开发 NextJS。我认为也许可以编写一个 ExpressJS 中间件,但我还不知道该怎么做,并问自己是否已经存在任何库。

通常我在 PHP Symfony 上工作,并习惯于管理这个 StofDoctrineExtensionsBundle,它很棒并且可以按预期工作。但我目前的项目是一个 Typescript 项目,只有 Express/NextJS/React/Prisma/MYSQL。

非常感谢您对知识的任何反馈。

提前致谢。

问候,

格利弗特

编辑:我当前的 API 必须移动到 Express/NextJS 仍然在 Symfony 上运行,记录所有更改的表如下所示:

{
    "id": 59807,
    "user": "ccba6ad2-0ae8-11ec-813f-0242c0a84005",
    "patient": "84c3ef66-548a-11ea-8425-0242ac140002",
    "action": "update",
    "logged_at": "2021-11-02 17:55:09",
    "object_id": "84c3ef66-548a-11ea-8425-0242ac140002",
    "object_class": "App\\Entity\\Patient",
    "version": 5,
    "data": "a:2:{s:10:\"birth_name\";s:2:\"--\";s:10:\"profession\";s:2:\"--\";}",
    "username": "johndoe",
    "object_name": "patient",
    "description": null
  }

关于数据库列的解释:

  • user => 与用户表的关系
  • 患者 => 与患者表的关系
  • action => 可以是“创建”/“更新”/删除”
  • logged_at => 更改完成的日期时间
  • object_id => 实体发生变化的实体行 ID
  • object_class=> 实体已更新
  • 版本 => 对象更改了多少次
  • 数据 => 修改期间所有数据都发生了变化
  • 用户名 => 登录用户的用户名进行了更改
  • object_name => 一个字符串,用于标识修改后的对象
  • 使用 object_class 的命名空间
  • description => 一个可以在某些特定更改上更新的值 * 通常在操作 delete 以跟踪例如删除的内容

【问题讨论】:

    标签: mysql express middleware prisma


    【解决方案1】:

    您可能会发现 prisma middleware 对此很有用。

    查看session data middleware 的示例,这与您正在执行的操作有些相似。

    对于您的用例,中间件可能如下所示:

    const prisma = new PrismaClient()
    
    const contextLanguage = 'en-us' // Session state
    
    prisma.$use(async (params, next) => {
    // you can find all possible params.action values in the `PrismaAction` type in `.prisma/client/index.d.ts`. 
      if (params.model == '_modelWhereChangeIsTracked_' && (params.action == 'create' || params.action == "update")) {
        // business logic to create an entry into the change logging table using session data of the user. 
      }
    
      return next(params)
    })
    
    // this will trigger the middleware 
    const create = await prisma._modelWhereChangeIsTracked_.create({
      data: {
        foo: "bar" 
      },
    })
    
    

    但是,请注意在使用 Prisma 中间件时有一些performance considerations

    您还可以为您预计需要在更改表中记录更改的路由创建express middleware。就个人而言,在大多数情况下,我会更喜欢这种方法,尤其是在需要记录更改的 API 路由的数量是预先知道且数量有限的情况下。

    【讨论】:

    • 感谢您的回复。听起来很完美,我之前没有注意到 Prisma 中间件(我是新手)。由于必须跟踪越来越少的所有数据以进行更改,我更喜欢使用 Prisma 中间件而不是 express 中间件。所有跟踪表的逻辑始终相同。再次感谢您的帮助。
    • 欢迎您!如果您要跟踪大量表的更改,那么我也同意 Prisma 中间件似乎是更易于管理的解决方案。
    • 顺便说一句,PrismaAction 中的所有可能的 params.action 值都可以在.prisma/client/index.d.ts 中找到。
    猜你喜欢
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多