具有多个env设置的TypeORM

时间:2017-07-22 10:39:02

标签: node.js typeorm

我想使用单独的数据库来运行测试。所以我尝试为多种环境(开发和测试)配置TypeORM,但它不起作用。它只使用' dev'配置。

这是我的npm脚本:

"scripts": {
    "start": "NODE_ENV=dev node dist/index.js",
    "test": "NODE_ENV=test mocha --reporter spec --compilers ts:ts-node/register 'test/**/*.test.ts'"
}

如果我console.log(process.env.NODE_ENV)我得到了正确的结果(" dev" /" test")。

这是我的ormconfig.json

[
  {
    "environment": "dev",
    "name": "default",
    "driver": {
      "type": "mysql",
      "host": "localhost",
      "port": 3306,
      "username": "root",
      "password": "",
      "database": "api"
    },
    "entities": [ "dist/model/*.js" ],
    "autoSchemaSync": true
  },
  {
    "environment": "test",
    "name": "default",
    "driver": {
      "type": "mysql",
      "host": "localhost",
      "port": 3306,
      "username": "root",
      "password": "",
      "database": "api_test"
    },
    "entities": [ "dist/model/*.js" ],
    "autoSchemaSync": true
  }
]

我与createConnection();联系。我事先手动创建了apiapi_test数据库。

为什么TypeORM没有使用"测试"我设置NODE_ENV = test?

时的配置

3 个答案:

答案 0 :(得分:1)

我有类似的问题。我通过为每个连接使用不同的“名称”字段来实现此目的。对于我的运行时连接,我保留了name=default,对于我的测试连接,我使用了name=test。所以:

[
  {
    "environment": "dev",
    "name": "default",
    "driver": {
      "type": "mysql",
      "host": "localhost",
      "port": 3306,
      "username": "root",
      "password": "",
      "database": "api"
    },
    "entities": [ "dist/model/*.js" ],
    "autoSchemaSync": true
  },
  {
    "environment": "test",
    "name": "test",          //// CHANGED
    "driver": {
      "type": "mysql",
      "host": "localhost",
      "port": 3306,
      "username": "root",
      "password": "",
      "database": "api_test"
    },
    "entities": [ "dist/model/*.js" ],
    "autoSchemaSync": true
  }
]

在我的应用程序中,我只使用createConnection(),它会自动使用与name=default的连接。

对于我的测试,我使用了typeorm的createConnections()(注意s)。这会加载所有连接。加载后,我会在使用getConnection('test')后立即获得测试连接。我的测试中的beforeAll在打字稿中看起来像这样:

  beforeAll(async () => {
    await createConnections();
    getConnection('test');
  });

在javascript中,它可能看起来像:

  beforeAll(() => {
    createConnections().then(() => {
        getConnection('test');
    });
  });

然后我的测试开始通过。希望有所帮助。

答案 1 :(得分:0)

答案 2 :(得分:0)

您可以将ormconfig.json更改为js文件,然后执行以下操作:

require('dotenv/config');


const database = {
  development: "dev-db",
  production: 'prod-db',
  test: 'test-db'
}

module.exports = {
  type: 'postgres',
  host: 'localhost',
  port: 5432,
  username: 'ur-username',
  password: 'password',
  database: database[process.env.NODE_ENV],
  entities: ['dist/**/*.entity{.ts,.js}'],
  synchronize: true,
  migrationsTableName: 'migration',
  migrations: ['migration/*.js'],
  cli: {
    migrationsDir: 'migration',
  },
};

然后,在运行测试时,请不要忘记设置适当的环境。 NODE_ENV=test应该可以。