Knex: migrar: hacer fallas con TypeScript

Creado en 18 ene. 2019  ·  27Comentarios  ·  Fuente: knex/knex

Ambiente

Versión de Knex: 0.16.3 (utilizando knexfile de TypeScript)
Base de datos + versión: PostgreSQL 10.5
Sistema operativo: Windows 10 Pro de 64 bits

Error

Cuando se ejecuta knex migrate:make somename , esta es la salida:

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 es el contenido de mi knexfile.ts :

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

Algunos detalles adicionales:

  • knex migrate:make somename funciona si cambio la extensión del archivo knex a .js . (knex 0.16.3)
  • knex migrate:make somename funciona como debería con el archivo knex de TypeScript cuando se usa el paquete knex 0.15.1 y @types/knex 0.15.1.
  • No he probado diferentes motores de base de datos o las versiones entre knex 0.15.1 - 0.16.3.
bug migrations

Comentario más útil

También usamos Knex para escribir la consulta en un servidor PostgreSQL. Descubrimos que la mejor forma de generar es la siguiente.

  1. Generar archivo de migración
knex migrate:make --knexfile knexfile.ts -x ts <your-migration-name>
  1. Ejecutar archivo de migración
knex migrate:latest --knexfile knexfile.ts 
  1. Generar archivo semilla
knex seed:make --knexfile knexfile.ts -x ts <your-seed-name>
  1. Ejecutar archivo semilla
knex seed:run --knexfile knexfile.ts 

El --knexfile knexfile.ts no será necesario si usa knexfile.js ya que el mecanografiado no puede proporcionarle ninguna verificación de tipo para el archivo de configuración.

Todos 27 comentarios

Creo que esto probablemente esté relacionado: https://github.com/tgriesser/knex/issues/2998
Puedo confirmar que funciona con 0.15.2 , pero no con 0.16.x

Creo que esto probablemente esté relacionado: # 2998
Puedo confirmar que funciona con 0.15.2, pero no 0.16.x

No, este es un tema diferente. y puedo confirmar que el número 2998 no se puede reproducir con la información proporcionada.

Parece que la resolución automática de knexfile no busca knexfile.ts, puede pasar --knexfile knexfile.ts argumento al comando o dar la ruta directamente al comando del generador de migración con:

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

Sin embargo, supongo que el cliente debería buscar knexfile.ts automáticamente.

Primero noté esto con migrate:latest , que curiosamente arroja un error diferente al de migrate:make . Aquí hay una reproducción simple donde puedes ver ambos: https://github.com/jrr/knex-ts-issue-repro

También noté hoy que knex --knexfile knexfile.ts migrate:make (...) creará un archivo .js en lugar de .ts. (anteriormente, cuando knex recogía automáticamente knexfile.ts , también producía automáticamente migraciones .ts)

También usamos Knex para escribir la consulta en un servidor PostgreSQL. Descubrimos que la mejor forma de generar es la siguiente.

  1. Generar archivo de migración
knex migrate:make --knexfile knexfile.ts -x ts <your-migration-name>
  1. Ejecutar archivo de migración
knex migrate:latest --knexfile knexfile.ts 
  1. Generar archivo semilla
knex seed:make --knexfile knexfile.ts -x ts <your-seed-name>
  1. Ejecutar archivo semilla
knex seed:run --knexfile knexfile.ts 

El --knexfile knexfile.ts no será necesario si usa knexfile.js ya que el mecanografiado no puede proporcionarle ninguna verificación de tipo para el archivo de configuración.

¿Algún plan para arreglar eso? Ha sido difícil aumentar la adopción de Knex con este problema: /

@dgadelha ¡ Gracias por el recordatorio! Lo echaré un vistazo hoy o mañana.

Se lanzó

También noté hoy que knex --knexfile knexfile.ts migrate:make (...) creará un archivo .js en lugar de .ts. (anteriormente, cuando knex recogía automáticamente knexfile.ts , también producía automáticamente migraciones .ts)

@kibertoad Acaba de instalar 0.17.6 y ese comportamiento todavía ocurre, incluso cuando se especifica ".ts" en el archivo Knex. ¿Son errores separados?

@mathieumg Sí. Vea las relaciones públicas que creé hace un par de minutos y que mencioné en este problema: D

@kibertoad ¡lo hice! La descripción hace que parezca que fue más bien para inferir la extensión basada en la misma extensión que el Knexfile, así que no estaba seguro.

The description makes it sounds like that was rather for inferring the extension based on the same extension as the Knexfile -> bueno, sí, se trata de inferir automáticamente la extensión de knexfile, sin importar si se especifica explícitamente o si se resuelve automáticamente.
0.17.6 resolución automática fija de archivos knex de TS.

¡Bien! Porque 0.17.6 con extension: "ts" todavía dio el resultado ".js". ¡Gracias por corregir esos errores! 😄

Porque 0.17.6 con extensión: "ts" todavía dio el resultado ".js"

Ah, quieres decir que tienes knexfile que tiene

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

¿en eso? Ese se solucionó en https://github.com/tgriesser/knex/commit/a65a95bc672563e01c08b40384e1dc2b079ecee1 , ya puede acceder bloqueando su versión en esta confirmación (si no desea apuntar directamente al maestro).
Desafortunadamente, no se actualizará a 0.17

0.18.0 todavía está bastante adelantado, pero si depender de las confirmaciones no es una opción para usted, podría lanzar next-1 en su lugar.

Hey, he comentado el PR, muchas gracias!

@kibertoad Impresionante, ¡gracias por la precisión! Podemos esperar en 0.18, sin estrés. 😄

@kibertoad El compromiso al que se refiere solo funciona si se define directamente en

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

Pero el objeto de migraciones que define dónde colocar, y desde dónde leer, las migraciones debe definirse en

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

Si muevo el objeto migrations fuera del objeto de entorno, se ignorará el directorio de migraciones.

@ViggoV ¡ Gracias por el informe de errores! Intentaré abordar esto hoy.

@ViggoV ¿Puede probar el último maestro e informar si funciona correctamente en su caso ahora?

Publicado en 0.18.0-next2

Lo siento, terminé cambiando a { ext: 'ts' } que funciona como esperaba, pero no parece estar documentado. Lo probaré cuando tenga tiempo

Hola, tuve el mismo problema. Resolví requerir ts-node / register en mi 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

}
};

'

No sé si ya resolvió el problema, pero en mi caso la solución fue muy simple. Solo muevo el _knexfile.js_ a la raíz del proyecto. Instalé el knex en el directorio "/ backend" pero, por una razón desconocida, el archivo se movió a otro directorio. Así que moví knexfile.js a "backend / knexfile.js" y funciona como un encanto. Espero que sea de utilidad para alguien.

Hola @moacirandretti , mi archivo knexfile.ts está en el proyecto raíz, pero cli heroku heroku run knex --knexfile knexfile.ts migrate: latest
devuelve este mensaje.

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)

Instalé este paquete ts-node en dependencia dev

Me enfrenté al mismo error.
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 };

cuando ejecuto knex migrate:make user recibí un error, pero cuando ejecuto knex migrate:make --migrations-directory ./scr/migrations -x ts user como se menciona en este comentario .

Texto mecanografiado
knex: 0,21,5
@ tipos / knex: 0.16.1

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

sandrocsimas picture sandrocsimas  ·  3Comentarios

nklhrstv picture nklhrstv  ·  3Comentarios

rarkins picture rarkins  ·  3Comentarios

aj0strow picture aj0strow  ·  3Comentarios

zettam picture zettam  ·  3Comentarios