在 NestJs 和 TypeORM 中生成和运行迁移不起作用

问题描述 投票:0回答:1

我刚刚接到一个项目,而 javascript 绝不属于我的专业范围。

我已经全局安装了 TypeORM 并尝试运行:

npm run typeorm migration:generate -d ./apps/server/src/common/datasource.ts

配置.ts

import { dataSource } from './datasource';

export const config = () => {
    try {
        const _config = {
            http: {
                port: process.env.NEST_API_HTTP_PORT,
                ssl: process.env.NEST_API_HTTP_SSL,
                key: process.env.NEST_API_HTTP_KEY,
                cert: process.env.NEST_API_HTTP_CERT,
                cors: process.env.NEST_API_HTTP_CORS,
                globalPrefix: process.env.NEST_API_HTTP_GLOBAL_PREFIX,
            },

            db: dataSource,

            secrets: {
                pwdsalt: process.env.NEST_API_SECRETS_PWDSALT,
                jwt: process.env.NEST_API_SECRETS_JWT,
            },

            rules_engine: {
                url: process.env.RULES_ENGINE_URL,
                globalPrefix: process.env.RULES_ENGINE_HTTP_GLOBAL_PREFIX,
            },
        };

        return configSchema.validateSync(_config);
    } catch (err) {
        throw new Error((err as ValidationError).message);
    }
};

数据源.ts

import { DataSource } from "typeorm";

export const dataSource = new DataSource({
    type: 'postgres',
    host: process.env.DATABASE_HOST,
    port: Number(process.env.DATABASE_PORT),
    name: process.env.DATABASE_NAME,
    username: process.env.DATABASE_USER,
    password: process.env.DATABASE_PASSWORD,
    synchronize: Boolean(process.env.DATABASE_ENABLE_SYNC)
});

package.json - 脚本:

"typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js",

它只是响应

Couldn't find tsconfig.json. tsconfig-paths will be skipped
'missing required argument: dataSource'

我尝试过更改路径,但也可以从 ts-node 到 typeorm 等可执行文件。

值得注意:它位于 Nx monorepo 项目中并使用 NestJs

node.js nestjs typeorm
1个回答
0
投票

NestJS/nx 版本缺失;)

但是,长话短说,这就是我在 NestJS 10、nx 17.3.0 上适用的方法:

  1. typeorm
    中创建目标
    project.json
    不是
    package.json
    !),使用命令:
TS_NODE_PROJECT="{PATH_RELATIVE_TO_MONOREPO_ROOT}" && \
  node && \
  --require ts-node/register && \
  --require tsconfig-paths/register && \
  {PATH_RELATIVE_TO_MONOREPO_ROOT}/mode_modules/typeorm/cli.js && \
  --config {PATH_RELATIVE_TO_MONOREPO_ROOT}/{PATH_TO_TYPEORM_CONFIG}

JSON 应该如下所示:

{
  "build": { "...": "..."},
  "migrate": {
    "command": "{COMMAND_FROM_ABOVE}"
  }
}
  1. 从 monorepo 根运行它
    nx run {backend_name}:{migrate}
  2. 此外,同步也不起作用,因为这意味着从应用程序的实体导入,并且从应用程序环境外部运行的 TypeORM CLI 无法使用它们。您需要找到一种手动构建实体索引的方法:)
  3. 此外,如果运行
    nx run backend:migrate --somearg "foo"
    ,参数很有可能无法被 nx 正确解析。因此,最好在
    project.json
    中创建一些目标(用于运行、滚动迁移等)。或者为此创建一个自定义执行器。

  1. 升级到 MikroORM。
© www.soinside.com 2019 - 2024. All rights reserved.