无法向邮递员发送请求,列违反了非空约束?

问题描述 投票:0回答:1

我需要使用rabbitmq通过apigateway将用户发送到我的存储库(postgres),但它说名称和其他列违反了非空约束?什么?是数据库错误吗?一些错误? ,有人知道我可以解决这个问题吗?

我的授权(兔子)服务:

@Injectable()
export class AuthService {
  constructor(
    @InjectRepository(UsuarioEntidade)
    private readonly usuarioRepository: Repository<UsuarioEntidade>
  ){}

  async acharEmail(email: string){
    return await this.usuarioRepository.findOne({where: {email}})
    
  }

  async criarUsuario(dados: CriaUsuarioDTO): Promise<UsuarioEntidade>{
    const { id, nome, email, senha, idade } = dados

    const achado = await this.acharEmail(dados.email)
    if(achado){
      throw new ConflictException('Usuario ja existente com esse email')
    }
    dados.id = randomUUID()
    const usuarioSalvar = await this.usuarioRepository.save({
      id, nome, email, senha, idade
    })
    return usuarioSalvar
  }

  async listarUsuarios(){
    return await this.usuarioRepository.find()
  }
}

我的授权(兔子)控制器:

@Controller()
export class AuthController {
  constructor(private readonly authService: AuthService) {}

  @MessagePattern({ cmd: 'get-usuarios'})
  async listarUsuarios(@Ctx() contexto: RmqContext){
    const channel = contexto.getChannelRef()
    const message = contexto.getMessage()
    channel.ack(message)

    return this.authService.listarUsuarios()
  }

  @MessagePattern({ cmd: 'post-usuarios'})
  async postarUsuarios(@Ctx() contexto: RmqContext, @Payload() dados: CriaUsuarioDTO){
    const canal = contexto.getChannelRef()
    const message = contexto.getMessage()
    canal.ack(message)

    return this.authService.criarUsuario(dados)
  }
}

我的API网关控制器:

@Controller()
export class AppController {
  constructor(@Inject('AUTH_SERVICE') private readonly authServico: ClientProxy) {}

  
  @Get('usuarios')
  async listarUsuarios(){
    return this.authServico.send(
      {
        cmd: 'get-usuarios'
      },
      {}
    )
  }

  @Post('usuarios')
  async criarUmUsuarios(
    @Body() dados: CriaUsuarioDTO){
      
    return this.authServico.send(
      {
        cmd: 'post-usuarios'
      },
      {dados}
    )
  }
}

我的用户实体.ts:

/* eslint-disable prettier/prettier */
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity('Usuario')
export class UsuarioEntidade {
    @PrimaryGeneratedColumn()
    id: string

    @Column()
    nome: string

    @Column()
    email: string

    @Column()
    senha: string
    
    @Column()
    idade: string
}

我的 dto 创建用户:

/* eslint-disable prettier/prettier */

export class CriaUsuarioDTO {
  id: string;

  nome: string;

  email: string;

  senha: string;

  idade: string;
}

请求邮递员:

{
    "nome": "jason",
    "email": "[email protected]",
    "senha": "polonia2244",
    "idade": "32"
    
}

收到的日志错误:

ERROR [RpcExceptionsHandler] null value in column "nome" of relation "Usuario" violates not-null constraint

postgres 记录器,我在终端中收到的:

postgres-1        | 2024-02-13 14:14:49.352 UTC [69] ERROR:  null value in column "nome" of relation "Usuario" violates not-null constraint
postgres-1        | 2024-02-13 14:14:49.352 UTC [69] DETAIL:  Failing row contains (4b6958b2-4ab2-4008-b154-f414de225484, null, null, null, null).
postgres-1        | 2024-02-13 14:14:49.352 UTC [69] STATEMENT:  INSERT INTO "Usuario"("nome", "email", "senha", "idade") VALUES (DEFAULT, DEFAULT, DEFAULT, DEFAULT) RETURNING "id"

Dockerfile(auth=rabbitmq):

FROM node

WORKDIR /usr/src/app

COPY package*.json .

RUN npm install

COPY . .

有谁知道这是什么原因造成的?我什么都试过了

node.js postgresql dockerfile rabbitmq nestjs
1个回答
0
投票

采取以下步骤后,终于开始了复制运行并让一切正常工作:

  1. 通过

    [email protected]
    安装
    pnpm install reflect-metadata@^0.2
    。这是由于 TypeORM 的更新,否则会导致
    reflect-metadata
    的两个版本,并导致 Nest 无法读取最终传递正确值所需的实际元数据

  2. AppController#criarUmUsuarios
    方法中,将
    { dados }
    方法的
    this.authService.send
    第二个参数更改为
    dados
    ,以便发送直接对象而不是嵌套对象,因为微服务未设置为使用嵌套对象目的。您可以选择让微服务与嵌套对象一起工作,但我发现这样更干净。

这些是我最终需要对代码本身进行的唯一更改,其他所有内容都与环境变量相关,因此我可以在本地运行该项目,并且一切正常。如果仍然遇到问题,您可能需要清除 docker 缓存。您应该使用与本地开发相同的 docker 包管理器,这样您就可以利用

pnpm-lock.yaml
文件来确保您在本地使用与映像中相同的依赖项。

© www.soinside.com 2019 - 2024. All rights reserved.