JavaScript中如何为根级对象创建Getter?TypeORM场景适配
如何在JavaScript中为根级对象创建“自动触发”的Getter(适配TypeORM场景)
这个需求完全可以实现!核心思路是延迟获取Repository实例,直到你真正调用它的方法时才初始化,避免在数据库连接建立前调用getConnection()报错。针对你的TypeORM场景,我推荐两种实用的解决方案:
方案一:使用ES6 Proxy(最灵活的方案)
Proxy可以拦截对象的所有属性访问,当你访问userModel.findOne这类方法时,自动动态获取Repository实例并返回对应的方法。这种方式不需要手动维护每个方法,所有Repository的属性/方法都能直接通过userModel调用。
import { getConnection } from 'typeorm'; import { User } from './path-to-your-user-model'; // 可选:缓存Repository实例,避免重复调用getConnection() let userRepositoryCache; export const userModel = new Proxy({}, { get(_target, property) { // 第一次访问时初始化Repository,之后直接用缓存 if (!userRepositoryCache) { userRepositoryCache = getConnection().getRepository(User); } // 将属性访问转发到Repository实例上 return userRepositoryCache[property]; } });
使用方式和你期望的完全一致:
// 直接调用,无需手动调用get() const user = await userModel.findOne({ id: 1 });
方案二:手动定义Getter属性(适合仅需少数方法的场景)
如果你只需要Repository的部分方法,可以为每个方法单独定义getter属性,这种方式更直观,但需要手动添加你需要的每个方法:
import { getConnection } from 'typeorm'; import { User } from './path-to-your-user-model'; export const userModel = { get findOne() { return getConnection().getRepository(User).findOne; }, get find() { return getConnection().getRepository(User).find; }, get save() { return getConnection().getRepository(User).save; } // 根据需要添加更多方法 };
为什么这能解决你的问题?
之前直接导出getConnection().getRepository(User)会报错,是因为模块加载时数据库连接还未初始化。而上面两种方案都是懒加载:只有当你第一次调用userModel的方法时,才会执行getConnection(),此时TypeORM已经完成了连接初始化,不会抛出错误。
内容的提问来源于stack exchange,提问作者Jon Sud
相关产品推荐
相关产品推荐

