I have a project with an API using TypeScript, NestJS and typeorm.
I am using typeorm version 0.2 but cause of security issues I have to upgrade to version 0.3 and there were a lot of changes. Now I am not sure, if I understand the DataSource correctly, which I haven't used before.
Before I used a ormconfig.ts file, not a json:
// ormconfig.ts
import "dotenv/config";
import * as path from "path";
import { ConnectionOptions } from "typeorm";
const connectionOptions: ConnectionOptions = {
type: "postgres",
host: process.env.TYPEORM_HOST,
port: parseInt(process.env.TYPEORM_PORT as string),
username: process.env.TYPEORM_USERNAME,
password: process.env.TYPEORM_PASSWORD,
database: process.env.TYPEORM_DATABASE,
entities: [path.join(__dirname, "**", "*.entity.{ts,js}")],
cache: true,
synchronize: false,
migrationsRun: false,
migrations: ["build/src/migration/*.js"],
cli: {
migrationsDir: "./migration",
},
};
export = connectionOptions;
And use it in app.module.ts like this:
// app.module.ts
import connectionOptions = require("./ormconfig");
@Module({
imports: [
TypeOrmModule.forRoot(connectionOptions),
],
})
export class AppModule {}
And if I need a transaction I used Injection:
// my-entity.service.ts
@Injectable()
export class MyEntityService {
constructor(
@InjectRepository(MyEntity)
@InjectConnection() private connection: Connection
) {}
}
But now Connection is depreacted, the cli property isn't available for PostgreSQL, and you should use DataSource.
I am doing this now and using this connection in app.module.ts like before:
// ormconfig.ts
import "dotenv/config";
import * as path from "path";
import { PostgresConnectionOptions } from "typeorm/driver/postgres/PostgresConnectionOptions";
const connectionOptions: PostgresConnectionOptions = {
type: "postgres",
host: process.env.TYPEORM_HOST,
port: parseInt(process.env.TYPEORM_PORT as string),
username: process.env.TYPEORM_USERNAME,
password: process.env.TYPEORM_PASSWORD,
database: process.env.TYPEORM_DATABASE,
entities: [path.join(__dirname, "**", "*.entity.{ts,js}")],
logging: process.env.TYPEORM_LOGGING === "true",
cache: true,
// Migrations
synchronize: false,
migrationsRun: false,
migrations: ["build/src/migration/*.js"],
};
export = connectionOptions;
I've added a data-source.ts:
// data-source.ts
import { DataSource } from "typeorm";
import connectionOptions = require("./ormconfig");
export const AppDataSource = new DataSource(connectionOptions);
I've changed Connection to DataSource:
// my-entity.service.ts
@Injectable()
export class MyEntityService {
constructor(
@InjectRepository(MyEntity)
@InjectConnection() private dataSource: DataSource
) {}
}
And cause of the missing cli property in the ConnectionOptions, I am using now the new CLI command with the migrations path and the data source instead of my old ormconfig file:
typeorm migration:generate ./src/migrations/update-my-entity-table -d ./src/data-source.ts
It seems all to work. Is this the right way?
Does the @InjectConnection() and changing from Connection to DataSource do all the job I needed?
Cause I never use the exported AppDataSource anywhere.
I am also not using [import reflect-metadata][1] anywhere like the typeorm documentation says.
Am I missing something?
CodePudding user response:
Nest will take the options you've passed and create a DataSource instance, so @InjectDataSource() still works just fine.The AppDataSource you have should pretty much just be for your CLI for ease of use.
Also, @nestjs/common imports reflect-metadata so you shouldn't have to worry about that either.
