NestJS中Cloud Firestore带变量的Where查询失效问题
问题解决:NestJS集成Firestore时变量查询返回空数组
核心原因
URL查询参数默认是字符串类型,尽管你在控制器里将query.userId声明为number,但实际传入的值是字符串(比如"1"),而Firestore中存储的userId是数字类型(1),两者类型不匹配导致查询无结果。硬编码1是数字,所以能匹配到数据。
修复步骤
1. 修正控制器的类型转换
修改控制器代码,将查询参数显式转换为数字:
@Get() getUserPosts(@Query() query: { userId: string }) { if (query.userId) { // 转换为数字后传入service return this.postsService.getUserPosts(Number(query.userId)); } else { return this.postsService.getPosts(); } }
或者使用parseInt确保类型正确:
return this.postsService.getUserPosts(parseInt(query.userId, 10));
2. 验证Firestore字段类型
确认Firestore集合posts中的userId字段类型为数字(而非字符串)。如果字段是字符串类型,需要将传入的变量保持字符串类型,或者统一转换为字符串查询:
// 如果Firestore中userId是字符串 .where('userId', '==', userId.toString())
3. 调试验证类型
在service中添加日志打印变量类型,确认传入的userId类型与Firestore字段一致:
async getUserPosts(userId: number): Promise<PostsDocument[]> { this.logger.log(`Getting posts for user with ID: ${userId}, type: ${typeof userId}`); // ... 剩余代码 }
补充说明
NestJS的@Query()装饰器不会自动将字符串转换为数字,即使你在接口中声明了类型,这是TypeScript编译时类型检查,运行时还是原始的字符串类型。必须手动转换类型才能保证查询条件匹配。
内容的提问来源于stack exchange,提问作者0x52616A657368
相关产品推荐
相关产品推荐

