Search code examples
typescriptdockerdocker-composenestjstypeorm

(EntityMetadataNotFoundError) Typeorm in nestjs cannot find the entity while running in a docker container via docker-compose


I get expetion

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)

My docker-compose file

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:

My dockerfile

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

My app module

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 {}

Message module

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 {}

The entity

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

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

  @Column()
  title: string;

  @Column()
  text: string;
}

It works if I run localy, no exeptions, works how I expect, but when I use docker, it throw the exeption above.

What I can do?

I tryed to use:

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

So I don't know what I should use... In docker container all files are there.


Solution

  • I've found the problem. The problem is in my docker image. I delete only containers forgotten about layers in it. There were no entities till I add one, so it uses code I used before.

    Deliting whole container and image I solved the problem.