ExpressJS / MYSQL / Prisma - 保存数据库的实体更改

ExpressJS / MYSQL / Prisma - Save DB' entities changes

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

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

通常我在 PHP Symfony 上工作并用来管理这个 StofDoctrineExtensionsBundle,它很棒并且按预期工作。但是我当前的项目是一个只有 Express/NextJS/React/Prisma/MYSQL.

的 Typescript 项目

我们将不胜感激您的任何反馈。

提前致谢。

此致,

古利维特

编辑:我当前的 API 必须移动到 Express/NextJS 在 Symfony 上仍然是 运行 并且记录所有更改的 table 看起来像这样:

{
    "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
  }

关于数据库列的说明:

您可能会发现 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

您还可以为您预计需要在更改 table 中记录更改的路线创建 express middleware。就个人而言,在大多数情况下,我 更喜欢这种方法 ,特别是如果需要记录更改的 API 路由的数量是事先已知的并且数量有限。