(EntityMetadataNotFoundError) 通过 docker-compose 在 docker 容器中运行时,nestjs 中的 Typeorm 无法找到实体

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

我得到了期待

No metadata for "MessageModel" was found.
2024-05-10 18:09:51 EntityMetadataNotFoundError: No metadata for "MessageModel" was found.
2024-05-10 18:09:51     at DataSource.getMetadata (/app/node_modules/typeorm/data-source/DataSource.js:304:19)
2024-05-10 18:09:51     at get metadata [as metadata] (/app/node_modules/typeorm/repository/Repository.js:15:40)
2024-05-10 18:09:51     at Repository.find (/app/node_modules/typeorm/repository/Repository.js:213:39)
2024-05-10 18:09:51     at MessagesService.findAll (/app/dist/messages/messages.service.js:34:45)
2024-05-10 18:09:51     at MessagesController.findAll (/app/dist/messages/messages.controller.js:27:42)
2024-05-10 18:09:51     at /app/node_modules/@nestjs/core/router/router-execution-context.js:38:29
2024-05-10 18:09:51     at InterceptorsConsumer.intercept (/app/node_modules/@nestjs/core/interceptors/interceptors-consumer.js:12:20)
2024-05-10 18:09:51     at /app/node_modules/@nestjs/core/router/router-execution-context.js:46:60
2024-05-10 18:09:51     at /app/node_modules/@nestjs/core/router/router-proxy.js:9:23
2024-05-10 18:09:51     at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)

我的 docker-compose 文件

version: '3.9'
services:
  postgres:
    image: postgres:16.3
    ports:
      - ${DB_PORT}:${DB_PORT}
    environment:
      - POSTGRES_DB=${DB_NAME}
      - POSTGRES_USER=${DB_USERNAME}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
    networks:
      - postgresN
    volumes:
      - db-data:/etc/data
  app:
    build: .
    depends_on:
      - postgres
    networks:
      - postgresN
    ports:
      - ${PORT}:${PORT}

networks:
  postgresN:
volumes:
  db-data:

我的dockerfile

FROM node:20.12.2-alpine
WORKDIR /app
COPY . .
EXPOSE 4000
RUN npm install
RUN npm run build
CMD node ./dist/main.js

我的应用程序模块

import { Module } from '@nestjs/common';
import { MessagesModule } from './messages/messages.module';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { getPgConfig } from './configs/postgres.config';
import { MessageModel } from './messages/message.model.ts/message.entity';

@Module({
  imports: [
    ConfigModule.forRoot(),
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: (configService: ConfigService) => {
        return getPgConfig(configService, [MessageModel]);
      },
    }),
    MessagesModule,
  ],
})
export class AppModule {}

留言模块

import { Module } from '@nestjs/common';
import { MessagesController } from './messages.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { MessagesService } from './messages.service';
import { MessageModel } from './message.model.ts/message.entity';

@Module({
  imports: [TypeOrmModule.forFeature([MessageModel])],
  controllers: [MessagesController],
  providers: [MessagesService],
})
export class MessagesModule {}

实体

import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class MessageModel {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column()
  title: string;

  @Column()
  text: string;
}

如果我在本地运行,它就可以工作,没有异常,按照我的预期工作,但是当我使用 docker 时,它会抛出上面的异常。

我能做什么?

我尝试使用:

entities: [__dirname + '/../**/*.entity.js']
entities: [__dirname + '/../**/*.entity.{js,ts}']
entities: [MessageModel]
imports: [UserModule,
  TypeOrmModule.forRoot({
    autoLoadEntities: true
  })
]

所以我不知道应该使用什么...在 docker 容器中所有文件都在那里。

typescript docker docker-compose nestjs typeorm
1个回答
0
投票

我发现问题了。问题出在我的 docker 镜像中。我只删除忘记其中层的容器。在我添加实体之前没有任何实体,因此它使用我之前使用过的代码。

删除整个容器和图像我解决了问题。

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