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
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.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.
knex migrate:make --knexfile knexfile.ts -x ts <your-migration-name>
knex migrate:latest --knexfile knexfile.ts
knex seed:make --knexfile knexfile.ts -x ts <your-seed-name>
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ó
¡Por favor revise!
https://github.com/tgriesser/knex/pull/3282
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áticamenteknexfile.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
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.El
--knexfile knexfile.ts
no será necesario si usaknexfile.js
ya que el mecanografiado no puede proporcionarle ninguna verificación de tipo para el archivo de configuración.