Knex: migrer: make échoue avec TypeScript

Créé le 18 janv. 2019  ·  27Commentaires  ·  Source: knex/knex

Environnement

Version Knex: 0.16.3 (en utilisant TypeScript knexfile)
Base de données + version: PostgreSQL 10.5
Système d'exploitation: Windows 10 Professionnel 64 bits

Punaise

Lors de l'exécution de knex migrate:make somename , voici la sortie:

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)

Voici le contenu de mon knexfile.ts :

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

Quelques détails supplémentaires:

  • knex migrate:make somename fonctionne si je change l'extension knexfile en .js . (annexe 0.16.3)
  • knex migrate:make somename fonctionne comme il se doit avec TypeScript knexfile lors de l'utilisation des packages knex 0.15.1 et @types/knex 0.15.1.
  • Je n'ai pas essayé différents moteurs de base de données ou les versions entre knex 0.15.1 - 0.16.3.
bug migrations

Commentaire le plus utile

Nous utilisons également Knex pour écrire la requête sur un serveur PostgreSQL. Nous avons découvert que la meilleure façon de générer est la suivante.

  1. Générer un fichier de migration
knex migrate:make --knexfile knexfile.ts -x ts <your-migration-name>
  1. Exécuter le fichier de migration
knex migrate:latest --knexfile knexfile.ts 
  1. Générer un fichier de départ
knex seed:make --knexfile knexfile.ts -x ts <your-seed-name>
  1. Exécuter le fichier de départ
knex seed:run --knexfile knexfile.ts 

Le --knexfile knexfile.ts ne sera pas nécessaire si vous utilisez knexfile.js car le dactylographié ne peut pas vous fournir de vérification de type pour le fichier de configuration.

Tous les 27 commentaires

Je pense que c'est probablement lié: https://github.com/tgriesser/knex/issues/2998
Je peux confirmer que cela fonctionne avec 0.15.2 , mais pas 0.16.x

Je pense que c'est probablement lié: # 2998
Je peux confirmer que cela fonctionne avec 0.15.2, mais pas 0.16.x

Non, c'est un problème différent. et je peux confirmer que # 2998 ne peut pas être reproduit avec les informations données.

On dirait que la résolution automatique de knexfile ne recherche pas knexfile.ts, vous pouvez passer l'argument --knexfile knexfile.ts à la commande ou donner le chemin directement à la commande du générateur de migration avec:

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

Je suppose que le client devrait chercher automatiquement knexfile.ts.

J'ai d'abord remarqué cela avec migrate:latest , qui lève de manière intéressante une erreur différente de migrate:make . Voici une simple repro où vous pouvez voir les deux: https://github.com/jrr/knex-ts-issue-repro

Nous avons également remarqué aujourd'hui que knex --knexfile knexfile.ts migrate:make (...) créera un fichier .js au lieu de .ts. (auparavant, lorsque knex récupérait automatiquement knexfile.ts , il produisait également automatiquement des migrations .ts)

Nous utilisons également Knex pour écrire la requête sur un serveur PostgreSQL. Nous avons découvert que la meilleure façon de générer est la suivante.

  1. Générer un fichier de migration
knex migrate:make --knexfile knexfile.ts -x ts <your-migration-name>
  1. Exécuter le fichier de migration
knex migrate:latest --knexfile knexfile.ts 
  1. Générer un fichier de départ
knex seed:make --knexfile knexfile.ts -x ts <your-seed-name>
  1. Exécuter le fichier de départ
knex seed:run --knexfile knexfile.ts 

Le --knexfile knexfile.ts ne sera pas nécessaire si vous utilisez knexfile.js car le dactylographié ne peut pas vous fournir de vérification de type pour le fichier de configuration.

Des plans pour résoudre ce problème? Il a été difficile d'augmenter l'adoption de Knex avec ce problème: /

@dgadelha Merci pour le rappel! Je vais jeter un œil aujourd'hui ou demain.

@dgadelha 0.17.6 avec un correctif pour cela a été publié. Malheureusement, le correctif pour la résolution de l'extension à partir de l'extension knexfile ne sera disponible que sur master (à partir de maintenant).

S'il-vous-plaît évaluez!
https://github.com/tgriesser/knex/pull/3282

Nous avons également remarqué aujourd'hui que knex --knexfile knexfile.ts migrate:make (...) créera un fichier .js au lieu de .ts. (auparavant, lorsque knex récupérait automatiquement knexfile.ts , il produisait également automatiquement des migrations .ts)

@kibertoad Je

@mathieumg Oui. Voir PR que j'ai créé il y a quelques minutes et référencé à partir de ce problème: D

@kibertoad je l'ai fait! La description donne l'impression que c'était plutôt pour déduire l'extension basée sur la même extension que le Knexfile, donc je n'étais pas sûr.

The description makes it sounds like that was rather for inferring the extension based on the same extension as the Knexfile -> eh bien oui, il s'agit d'inférer automatiquement l'extension à partir de knexfile, qu'il soit explicitement spécifié ou résolu automatiquement.
0.17.6 correction automatique des fichiers knexfiles TS.

Bien! Parce que 0.17.6 avec extension: "ts" donnait toujours le résultat ".js". Merci d'avoir corrigé ces bugs! 😄

Parce que 0.17.6 avec l'extension: "ts" donnait toujours le résultat ".js"

Ah, vous voulez dire que vous avez knexfile qui a

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

dedans? Celui-ci a été corrigé dans https://github.com/tgriesser/knex/commit/a65a95bc672563e01c08b40384e1dc2b079ecee1 , vous pouvez déjà y accéder en verrouillant votre version à ce commit (si vous ne voulez pas pointer directement vers master).
Malheureusement, il ne sera pas rétroporté à 0,17

0.18.0 est encore assez avancé, mais si, selon les commits, ce n'est pas une option pour vous, je pourrais publier next-1 à la place.

Hé, j'ai commenté le PR, merci beaucoup!

@kibertoad Génial, merci pour la précision! On peut attendre 0,18, pas de stress. 😄

@kibertoad Le commit

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

Mais l'objet migrations qui définit où placer et lire les migrations doit être défini sous

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

Si je déplace l'objet migrations hors de l'objet d'environnement, le répertoire des migrations sera ignoré.

@ViggoV Merci pour le rapport de bogue! Je vais essayer de résoudre ce problème aujourd'hui.

@ViggoV Pouvez-vous essayer le dernier master et signaler s'il fonctionne correctement dans votre cas maintenant?

Sorti en 0.18.0-next2

Désolé, j'ai fini par passer à { ext: 'ts' } qui fonctionne comme je m'y attendais mais ne semble pas être documenté. Je testerai quand j'aurai le temps

Salut, j'ai eu le même problème. J'ai résolu la nécessité de ts-node / register dans mon knexfile.ts comme ceci

»
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

}
};

»

Je ne sais pas si vous avez déjà résolu le problème, mais dans mon cas, la solution était très simple. Je déplace simplement le _knexfile.js_ à la racine du projet. J'ai installé le knex dans le répertoire "/ backend" mais pour une raison inconnue, le fichier a été déplacé vers un autre répertoire. J'ai donc déplacé knexfile.js vers "backend / knexfile.js" et fonctionne comme un charme. J'espère que cela sera utile pour quelqu'un.

Salut @moacirandretti , mon knexfile.ts est dans le projet racine, mais cli heroku heroku run knex --knexfile knexfile.ts migrate: latest
renvoyer ce message.

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)

J'ai installé ce package ts-node dans la dépendance dev

J'ai fait face à la même erreur.
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 };

quand j'exécute knex migrate:make user j'ai une erreur, mais quand j'exécute knex migrate:make --migrations-directory ./scr/migrations -x ts user comme mentionné par ce commentaire .

Écriture manuscrite: 4.0.2
knex: 0,21,5
@ types / knex: 0.16.1

Cette page vous a été utile?
0 / 5 - 0 notes