【问题标题】:NestJs TypeORM unable to connect to mysqlNestJs TypeORM无法连接到mysql
【发布时间】:2019-08-13 13:00:37
【问题描述】:

我正在尝试连接到 MySQL。我已经在我的根目录中的 .env 文件中定义了 db 连接变量,并且我正在初始化 app.module.ts 文件中的连接。 我现在面临的唯一问题是使用 CLI 创建或运行迁移时, 我按照 typeorm 文档here 配置连接,但是当我运行typeorm migrate:create -n myNewTable 时,它应该在指定目录中创建迁移文件,而是在应用程序根目录中创建它, 同样,我通过在typeorm migrate:create 之后使用-d 标志来指定目录解决了这个问题,但是当我尝试运行我的迁移文件时,我得到了这个

在任何配置文件中都找不到连接选项。

这是我的 app.module.ts 文件。

TypeOrmModule.forRoot({
      type: 'mysql',
      host: process.env.TYPEORM_HOST,
      port: parseInt(process.env.TYPEORM_PORT, 10),
      username: process.env.TYPEORM_USERNAME,
      password: process.env.TYPEORM_PASSWORD,
      database: process.env.TYPEORM_DATABASE,
      synchronize: false,
      migrations: [process.env.TYPEORM_MIGRATIONS],
      cli: {
        migrationsDir: process.env.TYPEORM_MIGRATIONS_DIR,
      },
      logging: (process.env.TYPEORM_LOGGING === 'true') ? true : false,
      entities: [__dirname + '/../**/*.entity{.ts,.js}'],
    }),
 

这是我的 .env 文件

# use .ts for development, .js for production
TYPEORM_CONNECTION = mysql
TYPEORM_HOST = 127.0.0.1
TYPEORM_PORT = 3306
TYPEORM_USERNAME = <username>
TYPEORM_PASSWORD = <password>
TYPEORM_DATABASE = <dbname>
TYPEORM_SYNCHRONIZE = true
TYPEORM_MIGRATIONSRUN = true
TYPEORM_LOGGING = true
TYPEORM_ENTITIES = src/**/**.entity.ts
#TYPEORM_ENTITIES = src/**/**.entity.js
TYPEORM_SUBSCRIBERS = src/subscriber/*.ts
#TYPEORM_SUBSCRIBERS = src/subscriber/*.js
TYPEORM_MIGRATIONS = src/database/migration/*.ts
TYPEORM_MIGRATIONS_DIR = src/database/migration
TYPEORM_SUBSCRIBERS_DIR = src/subscriber

任何帮助/提示都非常感谢,在此先感谢。

【问题讨论】:

标签: mysql node.js typescript nestjs typeorm


【解决方案1】:

有一个问题,您如何加载**TypeOrmModule**。你加载的方式是同步的,所以它只是意味着自定义 env 在应用程序启动时不会立即可用。

所以你可以做的是像下面那样异步加载 TypeOrmModule` -

 ConfigModule.forRoot({
  isGlobal: true, // [REQUIRED if want to use env gloablly among all modules]
 }),
 TypeOrmModule.forRootAsync({
      useFactory: () => ({
        type: 'mysql',
        host: process.env.TYPEORM_HOST,
        port: parseInt(process.env.TYPEORM_PORT, 10),
        username: process.env.TYPEORM_USERNAME,
        password: process.env.TYPEORM_PASSWORD,
        database: process.env.TYPEORM_DATABASE,
        synchronize: false,
        migrations: [process.env.TYPEORM_MIGRATIONS],
        cli: {
          migrationsDir: process.env.TYPEORM_MIGRATIONS_DIR,
        },
        logging: process.env.TYPEORM_LOGGING === 'true' ? true : false,
        entities: [__dirname + '/../**/*.entity{.ts,.js}'],
      }),
 }),

【讨论】:

    【解决方案2】:

    尝试在 ormconfig.json 或 .env 中更改您的实体目录,它对我有用:

    "entities": ["dist/**/**.entity{.ts,.js}"]
    

    【讨论】:

      【解决方案3】:

      您应该在项目根文件夹的ormconfig.json 中指定连接。

      看起来像这样

      {
          "type": "postgres",
          "host": "localhost",
          "port": <port>,
          "username": "",
          "password": "",
          "database": "",
          "entities": ["dist/**/*.entity{.ts,.js}"],
          "synchronize": true,
          "logging": "all",
          "migrations": [
              "migrations/**/*.js"
          ],
          "subscribers": [
              "subscriber/**/*.js"
          ],
          "cli": {
              "migrationsDir": "<migrations directory>",
              "subscribersDir": "<subscriber directory>"
          }
      }
      

      documentation 章节阅读更多内容

      附带说明,您可能必须删除 dist/ 文件夹才能使更改通过。

      【讨论】:

        【解决方案4】:

        您可以尝试以下方法:我不使用.env文件,我直接使用配置文件希望对您有用。

        创建 config.ts 文件

        粘贴这个:

        export const MYSQL = {
            HOST: 'localhost',
            PORT: 3306,
            USERNAME: 'db_user',
            PASSWORD: 'db_pass',
            DATABASE: 'db_name'
        };
        

        在您的连接配置写入文件中。就我而言,它是应用程序模块:

        import { MYSQL } from './config/config';
        
        TypeOrmModule.forRoot({
              type: 'mysql',
              host: MYSQL.HOST,
              port: MYSQL.PORT,
              username: MYSQL.USERNAME,
              password: MYSQL.PASSWORD,
              database: MYSQL.DATABASE,
              entities: [__dirname + '/**/*.entity{.ts,.js}'],
              synchronize: true,
            }),
        

        【讨论】:

        • 这是一个非常糟糕的实现。
        猜你喜欢
        • 2019-08-02
        • 2021-05-26
        • 2021-12-03
        • 2020-01-25
        • 2021-09-08
        • 2021-10-19
        • 1970-01-01
        • 2021-04-18
        • 2022-01-21
        相关资源
        最近更新 更多