Search code examples
javascripttypescriptnestjstypeormfaker

No metadata for "entity" was found when seeding


I'm building a seeding system using Faker over TypeORM throwing the following error on seeding:

🌱  TypeORM Seeding v1.6.1
✔ ORM Config loaded
✔ Factories are imported
✔ Seeders are imported
✔ Database connected
⠹ Executing CreateUsers Seeder
❌  Could not save entity
EntityMetadataNotFound: No metadata for "UsersEntity" was found.

✖ Could not run the seed CreateUsers!
Error: Could not save entity

error Command failed with exit code 1.

I'm using the CLI of the typeorm-seeding npm package in my package.json

"seed": "yarn migration:up && cross-env CLI=true ts-node -r tsconfig-paths/register ./node_modules/typeorm-seeding/dist/cli.js ---root src/core/config -n database-configuration.ts seed",

I have my user.factory.ts using the users.entity.ts

define(UsersEntity, async (faker: typeof Faker) => {
  const user = new UsersEntity();
  user.firstName = faker.name.firstName();
  user.lastName = faker.name.lastName();
  user.email = faker.internet.email().toLowerCase();
  user.phone = faker.phone.phoneNumber();
  user.imageUrl = faker.image.people();
  user.password = await CryptoUtils.getHash('password');
  user.role = Role.User;
  return user;
});

And the user.seeder.ts to run the seeding

export class CreateUsers implements Seeder {
  public async run(factory: Factory): Promise<any> {
    await factory(UsersEntity)().createMany(10);
  }
}

Finally, here is my database configuration used in the CLI to run the seeding

return {
    type: 'postgres',
    host: process.env.POSTGRES_HOST,
    port: +process.env.POSTGRES_PORT,
    username: process.env.POSTGRES_USER,
    password: process.env.POSTGRES_PASSWORD,
    database: process.env.POSTGRES_DB,
    entities:
      process.env.NODE_ENV === 'test'
        ? ['src/**/*.entity.ts']
        : ['dist/**/*.entity{.ts,.js}'],
    synchronize: false,
    keepConnectionAlive: true,
    migrationsRun: true,
    logging: process.env.DATABASE_SHOW_SQL === 'true' || false,
    migrations:
      process.env.NODE_ENV === 'test'
        ? ['src/core/database/migrations/**/*.ts']
        : ['dist/core/database/migrations/**/*.js'],
    seeds: ['src/core/database/seed/seeder/**/*{.ts,.js}'],
    factories: ['src/core/database/seed/factory/**/*{.ts,.js}'],
    cli: {
      migrationsDir: 'src/core/database/migrations',
    },
};

Solution

  • I solved this by adding the NODE_ENV check on my factories and seeds files to avoid getting files in dist and src.

    The problem was that I am working in development environment. The entities were found in the dist directory instead of factories and seeds who were found in the src instead of the dist folder.

    The solution was to apply the process.env.NODE_ENV check on the factories and seeds too:

    seeds:
        process.env.NODE_ENV === 'test'
            ? ['src/core/database/seed/seeder/**/*.ts']
            : ['dist/core/database/seed/seeder/**/*.js'],
    factories:
        process.env.NODE_ENV === 'test'
            ? ['src/core/database/seed/factory/**/*.ts']
            : ['dist/core/database/seed/factory/**/*.js'],