Knex: migrar: falha com TypeScript

Criado em 18 jan. 2019  ·  27Comentários  ·  Fonte: knex/knex

Meio Ambiente

Versão do Knex: 0.16.3 (usando o knexfile TypeScript)
Banco de dados + versão: PostgreSQL 10.5
SO: Windows 10 Pro 64 bits

Erro

Ao executar knex migrate:make somename , esta é a saída:

Requiring external module ts-node/register
Using environment: development
TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received type undefined
    at assertPath (path.js:39:11)
    at Object.resolve (path.js:166:7)
    at directories.map.directory (X:\Code\node\knextest\node_modules\knex\lib\migrate\MigrationGenerator.js:82:28)
    at Array.map (<anonymous>)
    at MigrationGenerator._absoluteConfigDirs (X:\Code\node\knextest\node_modules\knex\lib\migrate\MigrationGenerator.js:81:24)
    at MigrationGenerator._ensureFolder (X:\Code\node\knextest\node_modules\knex\lib\migrate\MigrationGenerator.js:41:23)
    at MigrationGenerator.make (X:\Code\node\knextest\node_modules\knex\lib\migrate\MigrationGenerator.js:35:17)
    at Migrator.make (X:\Code\node\knextest\node_modules\knex\lib\migrate\Migrator.js:122:27)
    at Command.commander.command.description.option.action (X:\Code\node\knextest\node_modules\knex\bin\cli.js:179:10)
    at Command.listener (X:\Code\node\knextest\node_modules\commander\index.js:315:8)
    at Command.emit (events.js:182:13)
    at Command.parseArgs (X:\Code\node\knextest\node_modules\commander\index.js:654:12)
    at Command.parse (X:\Code\node\knextest\node_modules\commander\index.js:474:21)
    at Liftoff.invoke (X:\Code\node\knextest\node_modules\knex\bin\cli.js:278:13)
    at Liftoff.execute (X:\Code\node\knextest\node_modules\liftoff\index.js:203:12)
    at module.exports (X:\Code\node\knextest\node_modules\flagged-respawn\index.js:51:3)

Este é o conteúdo do meu knexfile.ts :

module.exports = {
  development: {
    client: 'pg',
    connection: {
      host: 'localhost',
      database: 'postgres',
      user: 'postgres',
      password: 'pw',
    },
    migrations: {
      directory: 'migrations',
    },
  },
};

Alguns detalhes adicionais:

  • knex migrate:make somename funciona se eu mudar a extensão do knexfile para .js . (knex 0.16.3)
  • knex migrate:make somename funciona como deveria com o knexfile TypeScript ao usar o pacote knex 0.15.1 e @types/knex 0.15.1.
  • Não experimentei diferentes motores de banco de dados ou as versões entre knex 0.15.1 - 0.16.3.
bug migrations

Comentários muito úteis

Também usamos Knex para escrever a consulta em um servidor PostgreSQL. Descobrimos que a melhor forma de gerar é a seguinte.

  1. Gerar arquivo de migração
knex migrate:make --knexfile knexfile.ts -x ts <your-migration-name>
  1. Executar arquivo de migração
knex migrate:latest --knexfile knexfile.ts 
  1. Gerar arquivo semente
knex seed:make --knexfile knexfile.ts -x ts <your-seed-name>
  1. Executar arquivo seed
knex seed:run --knexfile knexfile.ts 

O --knexfile knexfile.ts não será necessário se você usar knexfile.js visto que o texto digitado não pode fornecer qualquer tipo de verificação para você para o arquivo de configuração.

Todos 27 comentários

Acho que provavelmente isso está relacionado: https://github.com/tgriesser/knex/issues/2998
Posso confirmar que funciona com 0.15.2 , mas não com 0.16.x

Acho que provavelmente está relacionado: # 2998
Posso confirmar que funciona com 0.15.2, mas não 0.16.x

Não, este é um problema diferente. e posso confirmar que # 2998 não pode ser reproduzido com as informações fornecidas.

Parece que a resolução automática de knexfile não procura knexfile.ts, você pode passar o argumento --knexfile knexfile.ts para o comando ou fornecer o caminho diretamente para o comando do gerador de migração com:

knex migrate:make --migrations-directory . -x ts migration-name

Suponho que o cliente deva procurar knexfile.ts automaticamente.

Notei isso pela primeira vez com migrate:latest , que curiosamente lança um erro diferente de migrate:make . Aqui está uma reprodução simples onde você pode ver ambos: https://github.com/jrr/knex-ts-issue-repro

Também observei hoje que knex --knexfile knexfile.ts migrate:make (...) criará um arquivo .js em vez de .ts. (anteriormente, quando o knex pegava knexfile.ts automaticamente, ele também produzia migrações .ts automaticamente)

Também usamos Knex para escrever a consulta em um servidor PostgreSQL. Descobrimos que a melhor forma de gerar é a seguinte.

  1. Gerar arquivo de migração
knex migrate:make --knexfile knexfile.ts -x ts <your-migration-name>
  1. Executar arquivo de migração
knex migrate:latest --knexfile knexfile.ts 
  1. Gerar arquivo semente
knex seed:make --knexfile knexfile.ts -x ts <your-seed-name>
  1. Executar arquivo seed
knex seed:run --knexfile knexfile.ts 

O --knexfile knexfile.ts não será necessário se você usar knexfile.js visto que o texto digitado não pode fornecer qualquer tipo de verificação para você para o arquivo de configuração.

Algum plano de consertar isso? Tem sido difícil aumentar a adoção do Knex com este problema: /

@dgadelha Obrigado pelo lembrete! Vou dar uma olhada hoje ou amanhã.

@dgadelha 0.17.6 com correção para isso foi lançado. Infelizmente, a correção para resolver a extensão da extensão knexfile só estará disponível no master (começando agora).

Também observei hoje que knex --knexfile knexfile.ts migrate:make (...) criará um arquivo .js em vez de .ts. (anteriormente, quando o knex pegava knexfile.ts automaticamente, ele também produzia migrações .ts automaticamente)

@kibertoad Acabou de instalar o 0.17.6 e esse comportamento ainda acontece, mesmo ao especificar ".ts" no Knexfile. Eles são insetos separados?

@mathieumg Sim. Veja o PR que criei há alguns minutos e mencionei a partir deste problema: D

@kibertoad eu fiz! A descrição parece que era para inferir a extensão com base na mesma extensão do Knexfile, então eu não tinha certeza.

The description makes it sounds like that was rather for inferring the extension based on the same extension as the Knexfile -> bem, sim, trata-se de inferir automaticamente a extensão do knexfile, independentemente de ser explicitamente especificado ou auto-resolvido.
0.17.6 autorresolução fixa de arquivos knex TS.

Tudo bem! Porque 0.17.6 com extension: "ts" ainda deu o resultado ".js". Obrigado por corrigir esses bugs! 😄

Porque 0.17.6 com extensão: "ts" ainda deu o resultado ".js"

Ah, você quer dizer que você tem knexfile que tem

{
...
migrations: {
  extension: "ts"
}

iniciar? Aquele foi corrigido em https://github.com/tgriesser/knex/commit/a65a95bc672563e01c08b40384e1dc2b079ecee1 , você já pode acessá-lo bloqueando sua versão neste commit (se você não quiser apontar diretamente para o master).
Infelizmente, não será feito backport para 0,17

0.18.0 ainda está bem à frente, mas se depender de commits não for uma opção para você, eu poderia lançar next-1 ao invés.

Ei, eu comentei o PR, muito obrigado!

@kibertoad Incrível, obrigado pela precisão! Podemos esperar 0,18, sem estresse. 😄

@kibertoad O commit a que você se refere só funciona se for definido diretamente em

module.exports = {
  migrations: {
    extension: 'ts';
  }
}

Mas o objeto migrations que define onde colocar e ler as migrações deve ser definido em

module.exports = {
  [environment]: {
    migrations: {
      directory: './migrations';
    }
}

Se eu mover o objeto migrations para fora do objeto de ambiente, o diretório de migrações será ignorado.

@ViggoV Obrigado pelo relatório do bug! Vou tentar resolver isso hoje.

@ViggoV Você pode tentar o mestre mais recente e relatar se está funcionando corretamente no seu caso agora?

Lançado em 0.18.0-next2

Desculpe, acabei mudando para { ext: 'ts' } que funciona como eu esperava, mas não parece estar documentado. Vou testar quando tiver tempo

Oi eu tive o mesmo problema. Resolvi a necessidade de ts-node / register em meu knexfile.ts como este

`
require ('ts-node / register')
const s = require ("./ settings.js");
module.exports = {

client: 'pg',
connection: {
  user: s.user,
  host: s.host,
  database: 'starwars',
  password: s.password,
  ssl: true

}
};

`

Não sei se já resolveu o problema mas no meu caso a solução foi muito simples. Acabei de mover o _knexfile.js_ para a raiz do projeto. Eu instalei o knex no diretório "/ backend", mas por motivo desconhecido o arquivo foi movido para outro diretório. Então mudei knexfile.js para "backend / knexfile.js" e funciona

Olá @moacirandretti , meu knexfile.ts está no projeto raiz, mas cli heroku heroku run knex --knexfile knexfile.ts migrate: latest
retornar esta mensagem.

Running knex --knexfile knexfile.ts migrate: latest on ⬢ backend-ecolab ... up, run.5056 (Free)
Failed to load external module ts-node / register
Failed to load external module typescript-node / register
Failed to load external module typescript-register
Failed to load external module typescript-require
Failed to load external module sucrase / register / ts
Failed to load external module @ babel / register
Error: Cannot find module 'ts-node / register'
Require stack:
- /app/knexfile.ts
- /app/node_modules/knex/bin/cli.js
    at Function.Module._resolveFilename (internal / modules / cjs / loader.js: 966: 15)
    at Function.Module._load (internal / modules / cjs / loader.js: 842: 27)
    at Module.require (internal / modules / cjs / loader.js: 1026: 19)
    at require (internal / modules / cjs / helpers.js: 72: 18)
    at Object. <anonymous> (/app/knexfile.ts:1:1)
    at Module._compile (internal / modules / cjs / loader.js: 1138: 30)
    at Object.Module._extensions..js (internal / modules / cjs / loader.js: 1158: 10)
    at Module.load (internal / modules / cjs / loader.js: 986: 32)
    at Function.Module._load (internal / modules / cjs / loader.js: 879: 14)
    at Module.require (internal / modules / cjs / loader.js: 1026: 19)

Eu instalei este pacote ts-node na dependência dev

Eu enfrentei o mesmo erro.
knexfile.ts:

import dotenv from "dotenv";
import { Config } from "knex";
dotenv.config();

interface KnexConfig {
  [name: string]: Config;
}

const knexConfig: KnexConfig = {
  development: {
    client: "pg",
    connection: {
      host: process.env.DB_HOST || "127.0.0.1",
      user: process.env.DB_USERNAME || "postgres",
      password: process.env.DB_PASSWRORD || "postgres",
      database: process.env.DB_DEV_NAME || "done_list",
    },
    migrations: {
      directory: "./migrations",
      extension: "ts",
    },
  },
  test: {
    client: "pg",
    connection: {
      host: process.env.DB_HOST || "127.0.0.1",
      user: process.env.DB_USERNAME || "postgres",
      password: process.env.DB_PASSWRORD || "postgres",
      database: process.env.DB_DEV_NAME || "done_list_test",
    },
  },
};

export { knexConfig };

quando executo knex migrate:make user , recebo um erro, mas quando executo knex migrate:make --migrations-directory ./scr/migrations -x ts user conforme mencionado neste comentário .

Texto datilografado: 4.0.2
knex: 0,21,5
@ types / knex: 0.16.1

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

PaulOlteanu picture PaulOlteanu  ·  3Comentários

aj0strow picture aj0strow  ·  3Comentários

npow picture npow  ·  3Comentários

marianomerlo picture marianomerlo  ·  3Comentários

legomind picture legomind  ·  3Comentários