POST请求创建用户报错:Field 'username'无默认值,求解决
Field 'username' doesn't have a default value 发起POST请求创建用户时触发QueryFailedError: Field 'username' doesn't have a default value错误,MySQL数据表已创建成功,但无法插入数据。以下是相关代码及错误信息,求排查解决。
UserService代码
import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { User } from 'src/typeorm/entities/User'; import { CreateUserParams } from 'src/utils/types'; import { Repository } from 'typeorm'; @Injectable() export class UsersService { constructor( @InjectRepository(User) private userRepository: Repository<User>, ) {} findUsers() {} createUser(userDetails: CreateUserParams) { const newUser = this.userRepository.create({ ...userDetails, createdAt: new Date(), }); return this.userRepository.save(newUser); } }
User实体代码
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; @Entity({ name: 'users' }) export class User { @PrimaryGeneratedColumn({ type: 'bigint' }) id: number; @Column({ unique: true }) username: string; @Column() password: string; @Column() createdAt: Date; @Column({ nullable: true }) authStrategy: string; }
错误信息
错误核心内容:
QueryFailedError: Field 'username' doesn't have a default value
at QueryFailedError.TypeORMError [as constructor] (typeorm-error.ts:7:28)
at new QueryFailedError (query-failed.error.ts:11:28)
at MySQLQueryRunner.(mysql-query-runner.ts:228:31)
...(后续调用栈省略)
排查与解决方案
这个错误的核心是插入数据时username字段未传入值,且MySQL表中该字段未设置默认值、也不允许为NULL。具体排查方向和解决办法如下:
1. 检查CreateUserParams类型定义
确认CreateUserParams是否包含username字段,TypeScript编译时如果类型定义遗漏该字段,不会报错,但实际运行时userDetails会缺失这个属性,导致插入失败。正确的类型定义示例:
export type CreateUserParams = { username: string; password: string; authStrategy?: string; };
2. 验证请求体参数是否正确
用接口测试工具(如Postman)发送请求时,确保请求体包含username和password字段,且格式为正确的JSON:
{ "username": "test_user", "password": "your_password" }
3. 确认TypeORM同步的表结构一致性
虽然数据表已创建,但可能实体定义和实际表结构存在差异。可直接查看MySQL中users表的username字段属性——从错误来看,该字段是NOT NULL且无默认值。如果业务允许用户名为空(不推荐),可修改实体装饰器:
@Column({ unique: true, nullable: true }) username: string;
但用户名一般为必填项,更推荐确保请求传入有效值,而非设置字段可空。
4. 打印日志排查参数是否正确接收
在createUser方法中添加日志,确认userDetails是否包含username:
createUser(userDetails: CreateUserParams) { console.log('接收的用户参数:', userDetails); const newUser = this.userRepository.create({ ...userDetails, createdAt: new Date(), }); return this.userRepository.save(newUser); }
如果日志中没有username,说明请求参数未正确传递或接口接收逻辑有问题。
内容的提问来源于stack exchange,提问作者Aashish Sapkota

