我有两个 .env 文件,例如
dev.env
和 staging.env
。我使用 typeorm 作为我的数据库 ORM。我想知道如何让 typeorm 在运行应用程序时读取任一配置文件。 Error: No connection options were found in any of configurations file
来自 typeormmodule。
您可以创建一个ConfigService,读取环境变量
NODE_ENV
对应的文件:
1) 在启动脚本中设置
NODE_ENV
变量:
"start:dev": "cross-env NODE_ENV=dev ts-node -r tsconfig-paths/register src/main.ts",
"start:staging": "cross-env NODE_ENV=staging node dist/src/main.js",
2)读取ConfigService中对应的.env文件
@Injectable()
export class ConfigService {
private readonly envConfig: EnvConfig;
constructor() {
this.envConfig = dotenv.parse(fs.readFileSync(`${process.env.NODE_ENV}.env`));
}
get databaseHost(): string {
return this.envConfig.DATABASE_HOST;
}
}
3) 使用
ConfigService
设置数据库连接:
TypeOrmModule.forRootAsync({
imports:[ConfigModule],
useFactory: async (configService: ConfigService) => ({
type: configService.getDatabase()
// ...
}),
inject: [ConfigService]
}),
1)我使用
typeorm
来使用迁移,但在这种情况下我想使用两个不同的文件夹进行迁移(表结构)和种子(默认数据到表)
2)所以这就是我在
nestjs
中用typeorm
解决这个问题的方法
// config for typeorm and used for mysql driver also
import { DataSource, DataSourceOptions } from 'typeorm';
import { config } from 'dotenv';
config();
const { MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, PATH_TO_RUN
} =
process.env;
export const dbConfig: DataSourceOptions = {
type: 'mysql',
host: MYSQL_HOST,
port: 3306,
username: MYSQL_USER,
password: MYSQL_PASSWORD,
database: MYSQL_DATABASE,
entities: ['dist/**/*.entity.js'],
migrations: [`dist/db/${PATH_TO_RUN}/*.js`], // update this path with env
};
export default new DataSource(dbConfig);
3) package.json 使用
cross-env
这用于 typeorm 后看起来像这样
// DON'T PLACE `cross-env` in build script use it in `typeorm` execution script
script: {
"migration:run": "yarn build && cross-env PATH_TO_RUN=migrations yarn typeorm migration:run -d dist/db/mysql.config.js",
"seed:run": "yarn build && cross-env PATH_TO_RUN=seeds yarn typeorm migration:run -d dist/db/mysql.config.js"
}
4) 要运行此 npm 脚本,请使用以下命令
yarn migration:run // 使用 typeorm 中的迁移文件夹
yarn seeds:run // 在 typeorm 中使用种子文件夹
!!在使用 Yarn 和 Cross-env 之前,请确保已安装它!!
npm install --global yarn
yarn add cross-env