Expo React Native中TypeORM无法保存实体至SQLite数据库
解决Expo + TypeORM SQLite数据保存卡住的问题
针对你遇到的TypeORM无法保存数据、操作卡住无响应的情况,给你几个具体的排查和解决方向:
1. 补全实体必填字段值
你的Wallet实体中amount字段使用@Column()默认标记为必填,但你创建的wallet对象仅设置了accountId、name、id,未给amount赋值。TypeORM在处理必填字段缺失时,可能出现静默阻塞或无明确报错的失败情况。
两种修改方式:
- 直接给
wallet对象补充amount值:wallet.id = body.id; wallet.amount = 0; // 或从后端返回的body中获取对应值 - 若
amount允许为空,修改实体字段配置:@Column({ nullable: true }) amount: number;
2. 统一异步语法,改用await处理保存操作
你在async函数中混用了await和then/catch,可能导致Promise未被正确处理,出现卡住情况。统一使用await配合try/catch来捕获错误:
console.log("SAVING"); try { const res = await walletRepo.save(wallet); console.log("保存结果:", res); } catch (err) { console.log("保存失败:", err); }
3. 给DataSource初始化添加错误捕获
当前代码中dataSource.initialize()未做错误处理,如果初始化过程中出现问题(比如实体定义错误、数据库创建失败),会导致后续Repo操作无响应。添加try/catch排查初始化是否失败:
if (!dataSource.isInitialized) { try { const source = await dataSource.initialize(); walletRepo = source.getRepository(Wallet); console.log("数据库初始化成功"); } catch (initErr) { console.log("数据库初始化失败:", initErr); return; // 初始化失败直接终止后续操作 } }
4. 检查其他实体的定义合法性
你的DataSource配置中加载了User和Financial实体,如果这两个实体存在语法错误(比如装饰器使用错误、字段类型不匹配),会导致整个数据库连接初始化异常,间接影响Wallet的操作。请确认这两个实体的定义符合TypeORM规范。
5. 验证数据库表是否正确创建
由于你设置了synchronize: true,TypeORM会自动创建数据库表。可以通过Expo的SQLite调试工具查看test_db_local数据库是否存在,以及wallet表是否被正确生成。如果表未创建,说明实体加载或DataSource配置存在问题。
内容的提问来源于stack exchange,提问作者Vitor
相关产品推荐
相关产品推荐

