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',
},
};
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'],