Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Error during migration show:

Olá pessoal, estou com esse problema ao executar o migration:show do TypeORM. Já fiz downgrade do meu nodejs para a versão 18, já usei q ultima versão também, além disso eu também ja deletei o node_modules e package-lock.js umas 3 ou 4 vezes e instalei novamente e o problema persiste!

Config do cli:

import { DataSource, DataSourceOptions } from "typeorm";
import 'dotenv/config';

const dataSourceOptions: DataSourceOptions = {
  type: 'postgres',
  host: process.env.DB_HOST,
  port: Number(process.env.DB_PORT),
  username: process.env.DB_USERNAME,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME,
  entities: [__dirname + '/../**/*.entity.{js,ts}'],
#   migrations: [__dirname + '/migrations/*.{js,ts}']
}
const dataSource = new DataSource(dataSourceOptions);

export default dataSource;

Erro: Error during migration show: Error: Unable to open file: "C:\loja\src\db\data-source-cli.ts". Cannot use import statement outside a module

Comando executado: typeorm-ts-node-esm -d src/db/data-source-cli.ts migration:show

Repositório no github: https://github.com/magnata19/loja-nestjs.git

2 respostas

Olá! Boa tarde, @Davidson, Parece que você está enfrentando um problema ao executar o comando migration:show do TypeORM devido a um erro de importação. O erro específico "Cannot use import statement outside a module" geralmente ocorre quando o TypeScript não consegue reconhecer os módulos corretamente.

Aqui estão algumas etapas que você pode seguir para solucionar esse problema:

  1. Verifique as configurações do tsconfig.json: Certifique-se de que seu arquivo tsconfig.json está configurado corretamente para suportar ES modules. Adicione ou ajuste as seguintes configurações:

    {
      "compilerOptions": {
        "module": "ESNext",
        "moduleResolution": "node",
        "target": "ESNext",
        "esModuleInterop": true,
        "allowSyntheticDefaultImports": true,
        "outDir": "./dist",
        "rootDir": "./src",
        // outras configurações
      }
    }
    
  2. Atualize o comando de execução: Certifique-se de que você está usando o comando correto para executar o script do TypeORM com suporte a ES modules. Tente usar ts-node com a flag --esm:

    ts-node --esm -r tsconfig-paths/register src/db/data-source-cli.ts migration:show
    
  3. Verifique as dependências: Certifique-se de que você instalou todas as dependências necessárias, incluindo ts-node e tsconfig-paths:

    npm install ts-node tsconfig-paths
    
  4. Verifique o caminho dos arquivos: Certifique-se de que o caminho para o arquivo data-source-cli.ts está correto e que o arquivo realmente existe nesse local.

  5. Atualize sua configuração de migrações: Certifique-se de que o caminho para as migrações está correto no seu arquivo de configuração:

    const dataSourceOptions: DataSourceOptions = {
      type: 'postgres',
      host: process.env.DB_HOST,
      port: Number(process.env.DB_PORT),
      username: process.env.DB_USERNAME,
      password: process.env.DB_PASSWORD,
      database: process.env.DB_NAME,
      entities: [__dirname + '/../**/*.entity.{js,ts}'],
      migrations: [__dirname + '/migrations/*.{js,ts}']
    };
    
  6. Utilize dotenv/config: Certifique-se de que você está carregando as variáveis de ambiente corretamente. Adicione dotenv/config no início do seu comando de execução:

    node -r dotenv/config -r ts-node/register --loader ts-node/esm src/db/data-source-cli.ts migration:show
    

Siga essas etapas para tentar resolver o problema. Se o erro persistir, por favor, forneça mais detalhes sobre a mensagem de erro ou outras informações relevantes para que possamos continuar ajudando.

solução!

Boa noite silas, tudo bom? Alterei esses configurações no código e mesmo assim continuou me gerando um erro e após continuar pesquisando eu achei uma solução que funcinou pra mim, vou estar disponibilizando aqui.

"typeorm": "ts-node ./node_modules/typeorm/cli",
    "migration:create": "npm run typeorm -- migration:create ./src/migrations/$npm_config_name",
    "migration:run": "npm run typeorm migration:run -- -d ./src/db/data-source.ts",
    "migration:revert": "npm run typeorm migration:revert -- -d ./src/db/data-source.ts",

adicionei esses 3 scripts no meu package.json e meu arquivo de configuração do data-source ficou assim:

import { DataSource, DataSourceOptions } from "typeorm";
import { config } from "dotenv";
import { ConfigService } from "@nestjs/config";

config();

const configService = new ConfigService();

const dataSourceOptions: DataSourceOptions = {
  type: 'postgres',
  host: configService.get<string>('DB_HOST'),
  port: configService.get<number>('DB_PORT'),
  username: configService.get<string>('DB_USERNAME'),
  password: configService.get<string>('DB_PASSWORD'),
  database: configService.get<string>('DB_NAME'),
  entities: [__dirname + '/../**/*.entity{.ts,.js}'],
  migrations: [__dirname + '/migrations/*.{js,ts}']
}
export default new DataSource(dataSourceOptions);

para rodar uma migration basta rodar: npm run migration:create -name=nome_da_migration

no package.json eu utilizo $npm_config_name que serve justamente para pegar o parâmetro que passamos no -name=

bora pra cima!