我需要使用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 . .
有谁知道这是什么原因造成的?我什么都试过了
采取以下步骤后,终于开始了复制运行并让一切正常工作:
通过
[email protected]
安装 pnpm install reflect-metadata@^0.2
。这是由于 TypeORM 的更新,否则会导致 reflect-metadata
的两个版本,并导致 Nest 无法读取最终传递正确值所需的实际元数据
在
AppController#criarUmUsuarios
方法中,将 { dados }
方法的 this.authService.send
第二个参数更改为 dados
,以便发送直接对象而不是嵌套对象,因为微服务未设置为使用嵌套对象目的。您可以选择让微服务与嵌套对象一起工作,但我发现这样更干净。
这些是我最终需要对代码本身进行的唯一更改,其他所有内容都与环境变量相关,因此我可以在本地运行该项目,并且一切正常。如果仍然遇到问题,您可能需要清除 docker 缓存。您应该使用与本地开发相同的 docker 包管理器,这样您就可以利用
pnpm-lock.yaml
文件来确保您在本地使用与映像中相同的依赖项。