You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

POST请求创建用户报错:Field 'username'无默认值,求解决

问题:POST请求创建用户失败,提示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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 08:07:34