NestJs TypeORM无法连接到MySQL

时间:2019-03-22 14:04:17

标签: mysql node.js typescript nestjs typeorm

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

  

在任何配置文件中均未找到连接选项。

这是我的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

我们非常感谢您的帮助/提示。

4 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:0)

您可以尝试以下操作:我不使用.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,
    }),

答案 2 :(得分:0)

您应该在项目根文件夹的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 / 文件夹才能进行更改。

答案 3 :(得分:0)

有一个问题,您如何加载 **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}'],
      }),
 }),