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
}
关于数据库列的说明:
- 用户 => 与用户的关系 table
- 患者 => 与患者的关系 table
- action => 可以是“创建”/“更新”/删除
- logged_at => 完成更改的日期时间
- object_id => 实体发生变化的实体行 ID
- object_class => 实体已更新
- 版本 => 对象更改了多少次
- data => 修改期间所有数据发生变化
- 用户名 => 登录用户的用户名进行了更改
- object_name => 一个字符串,用于标识未修改的对象
- 使用 object_class
的命名空间
- 描述 => 一个可以根据某些特定更改更新的值 * 通常在删除操作期间以跟踪删除的内容,例如
您可能会发现 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 路由的数量是事先已知的并且数量有限。
我正在寻找一种方法来保存某些实体的数据库实体更改。我的意思是我需要在数据库 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
}
关于数据库列的说明:
- 用户 => 与用户的关系 table
- 患者 => 与患者的关系 table
- action => 可以是“创建”/“更新”/删除
- logged_at => 完成更改的日期时间
- object_id => 实体发生变化的实体行 ID
- object_class => 实体已更新
- 版本 => 对象更改了多少次
- data => 修改期间所有数据发生变化
- 用户名 => 登录用户的用户名进行了更改
- object_name => 一个字符串,用于标识未修改的对象
- 使用 object_class 的命名空间
- 描述 => 一个可以根据某些特定更改更新的值 * 通常在删除操作期间以跟踪删除的内容,例如
您可能会发现 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 路由的数量是事先已知的并且数量有限。