我有一个使用TypeScript
、NestJS
和typeorm
的API项目。
我使用的是typeorm
版本0.2,但由于安全问题,我不得不升级到版本0.3,并且有很多变化。现在我不确定我是否正确理解了DataSource
,我以前没有使用过。
之前我使用的是ormconfig.ts
文件,而不是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;
在app.module.ts
中使用它,如下所示:
// app.module.ts
import connectionOptions = require("./ormconfig");
@Module({
imports: [
TypeOrmModule.forRoot(connectionOptions),
],
})
export class AppModule {}
如果我需要一个事务,我使用了Injection:
// my-entity.service.ts
@Injectable()
export class MyEntityService {
constructor(
@InjectRepository(MyEntity)
@InjectConnection() private connection: Connection
) {}
}
但是现在Connection
被取消了,cli
属性对于PostgreSQL
不可用,您应该使用DataSource
。
我现在这样做,并像以前一样在app.module.ts
中使用此连接:
// 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;
我添加了一个data-source.ts
:
// data-source.ts
import { DataSource } from "typeorm";
import connectionOptions = require("./ormconfig");
export const AppDataSource = new DataSource(connectionOptions);
我已将Connection
更改为DataSource
:
// my-entity.service.ts
@Injectable()
export class MyEntityService {
constructor(
@InjectRepository(MyEntity)
@InjectConnection() private dataSource: DataSource
) {}
}
由于ConnectionOptions
中缺少cli
属性,我现在使用的是带有迁移路径和数据源的新CLI命令,而不是旧的ormconfig文件:
typeorm migration:generate ./src/migrations/update-my-entity-table -d ./src/data-source.ts
看起来一切正常。这是正确的方法吗?@InjectConnection()
和从Connection
到DataSource
的更改是否完成了我需要的所有工作?因为我从来没有在任何地方使用导出的AppDataSource
。
我也没有像typeorm
文档所说的那样在任何地方使用[import reflect-metadata][1]
。
我错过了什么吗?
1条答案
按热度按时间axr492tv1#
Nest将接受您传递的选项并创建一个DataSource示例,因此
@InjectDataSource()
仍然可以正常工作。此外,
@nestjs/common
导入reflect-metadata
,因此您也不必担心这一点。