Nestjs登录时报invalid input syntax for type integer: 邮箱值错误
问题原因
你遇到的报错根源是AuthService中signIn方法的findOne调用写法错误:
TypeORM 的 Repository.findOne() 方法如果直接传入非对象类型的参数(比如你这里传的email字符串),会默认把参数值当做**主键字段(也就是你User实体定义的id,类型为int)**进行匹配查询。
数据库执行查询时尝试把你传入的邮箱字符串don@gmail.com转为整数匹配id字段,自然就抛出了invalid input syntax for type integer的类型错误,和你的email字段本身的类型定义没有关系。
解决方法
修改AuthService的signIn方法中findOne的传参,明确指定查询条件为email字段即可,写法根据你使用的TypeORM版本略有不同:
- 如果你用的是 TypeORM 0.3.x 及以上版本:
// 原错误写法 // const user = await this.usersRepository.findOne(email); // 修正后写法 const user = await this.usersRepository.findOne({ where: { email } });
- 如果你用的是 TypeORM 0.2.x 版本:
const user = await this.usersRepository.findOne({ email });
修改完成后重新测试登录接口即可正常运行。
同类问题排查思路
遇到类似数据库类型不匹配报错时,可以按以下步骤快速定位:
- 先核对报错中提到的字段类型和传入值的类型差异,确认是哪个字段被错误赋值
- 检查对应查询逻辑的参数写法,确认是否有ORM方法使用不符合语法规范的问题
- 打印ORM生成的原生SQL语句核对,能更直观发现查询条件和字段的匹配错误
内容的提问来源于stack exchange,提问作者Marko Marchisio
相关产品推荐
相关产品推荐

