我在MySQL上使用TypeORM,并通过MySQL触发器设置了所有列和数据库表的自动审核-而不是TypeORM的“记录器”功能(除非您有一些额外的信息)...
不用担心,MySQL触发器方法可以很好地工作,这意味着不需要应用程序端代码。
问题:我无法以不需要我们在此应用程序中创建的每个查询中应用它的方式向MySQL查询提供已登录应用程序用户的ID。我们确实有一个中央的“ CRUD”类,但这是针对通用CRUD的,因此我们更“专业”的查询将需要特殊处理-这是不希望的。
我们每个表都有一个int字段“ editedBy”,我们想在其中使用编辑行的用户ID(通过使用我们的应用程序)进行更新。
问题:有没有办法拦截TypeORM中的所有非读取查询(无论其活动记录还是查询生成器),并能够更新受影响表中的列('editedBy'int字段)?
这将使我们的触发器解决方案得以完善。
附言我试用了TypeORM的自定义日志记录功能:
... typeorm createConnection({ ....
logger: new MyCustomLogger()
... });
class MyCustomLogger { // 'extend' has issue - works without anyway: extends Logger {
logQuery(query, parameters, somethingelse) // WORKS
{ ... }
logQuery似乎在将查询发送到MySQL之前就触发了(我认为),但是我无法找到一种方法来从中提取“类似于Json”的javascript对象,以修改每个表的“ editedBy”。如果有一种方法可以找到此函数中的所有表并调整editedBy,那就太好了。很高兴尝试其他选择...不需要更新包含数据库调用的许多文件。
谢谢
最佳答案
恕我直言,使用TypeOrm的日志记录功能来修改您的查询应该是不正确的,即使这样做很费力,也是非常危险的。
如果要管理在TypeOrm中完成ups查询的方式,最好的做法是使用自定义存储库,然后始终对其进行调用(不要像entityManager.getRepository(Specialist)
那样派生香草存储库,而是将其与entityManager.getCustomRepository(SpecialistRepository)
一起使用)。
关于该主题的官方文档应该对您有很大帮助:https://github.com/typeorm/typeorm/blob/master/docs/custom-repository.md
然后,在自定义存储库中,您可以覆盖save
方法并添加所需的任何内容。您的代码将是明确的,并且有一个很好的优点,即它并不适用于每个实体,因此,如果您有其他不同的情况要保存时,就不会卡住(也可以添加自定义保存方法)。
如果要泛化保存方法的处理,则可以创建一个抽象存储库以扩展TypeOrm存储库,然后再与您的自定义存储库一起扩展,可以在其中添加自定义代码,以免最终复制它在每个自定义存储库中。
SpecialistRepository<Specialist> -> CustomSaveRepository<T> -> Repository<T>
关于mysql - TypeORM/MySQL-拦截更新/插入查询并在“editedBy”列上自动设置应用程序用户ID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59318145/