Knex: migrieren: make schlägt mit TypeScript fehl

Erstellt am 18. Jan. 2019  ·  27Kommentare  ·  Quelle: knex/knex

Umgebung

Knex-Version: 0.16.3 (Verwenden von TypeScript-Knexdatei)
Datenbank + Version: PostgreSQL 10.5
Betriebssystem: Windows 10 Pro 64 Bit

Fehler

Wenn Sie knex migrate:make somename , ist dies die Ausgabe:

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)

Dies ist der Inhalt meiner knexfile.ts :

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

Einige zusätzliche Details:

  • knex migrate:make somename funktioniert, wenn ich die Erweiterung der Knexdatei in .js ändere. (knex 0,16,3)
  • knex migrate:make somename funktioniert mit TypeScript knexfile wie es sollte, wenn das Paket knex 0.15.1 und @types/knex 0.15.1 verwendet wird.
  • Ich habe nicht verschiedene Datenbank-Engines oder die Versionen zwischen knex 0.15.1 - 0.16.3 ausprobiert.
bug migrations

Hilfreichster Kommentar

Wir verwenden Knex zum Schreiben der Abfrage auf einen PostgreSQL-Server. Wir haben festgestellt, dass der beste Weg zum Generieren der folgende ist.

  1. Migrationsdatei generieren
knex migrate:make --knexfile knexfile.ts -x ts <your-migration-name>
  1. Führen Sie die Migrationsdatei aus
knex migrate:latest --knexfile knexfile.ts 
  1. Seed-Datei generieren
knex seed:make --knexfile knexfile.ts -x ts <your-seed-name>
  1. Führen Sie die Startdatei aus
knex seed:run --knexfile knexfile.ts 

Das --knexfile knexfile.ts ist nicht erforderlich, wenn Sie knexfile.js da das Typoskript keine Typprüfung für die Konfigurationsdatei für Sie bereitstellen kann.

Alle 27 Kommentare

Ich denke, das hängt wahrscheinlich damit zusammen: https://github.com/tgriesser/knex/issues/2998
Ich kann bestätigen, dass es mit 0.15.2 funktioniert, aber nicht mit 0.16.x

Ich denke, das hängt wahrscheinlich zusammen: # 2998
Ich kann bestätigen, dass es mit 0.15.2 funktioniert, aber nicht mit 0.16.x.

Nein, das ist ein anderes Thema. und ich kann bestätigen, dass # 2998 mit gegebenen Informationen nicht reproduziert werden kann.

Klingt so, als ob die automatische Auflösung von knexfile nicht nach knexfile.ts sucht. Sie können das Argument --knexfile knexfile.ts an den Befehl übergeben oder den Pfad direkt zum Befehl des Migrationsgenerators angeben mit:

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

Ich nehme an, der Client sollte automatisch nach knexfile.ts suchen.

Ich habe dies zum ersten Mal bei migrate:latest bemerkt, was interessanterweise einen anderen Fehler als migrate:make . Hier ist ein einfacher Repro, in dem Sie beide sehen können: https://github.com/jrr/knex-ts-issue-repro

Heute wurde auch bemerkt, dass knex --knexfile knexfile.ts migrate:make (...) eine .js-Datei anstelle von .ts erstellt. (Wenn knex zuvor automatisch knexfile.ts , werden auch automatisch .ts-Migrationen erzeugt.)

Wir verwenden Knex zum Schreiben der Abfrage auf einen PostgreSQL-Server. Wir haben festgestellt, dass der beste Weg zum Generieren der folgende ist.

  1. Migrationsdatei generieren
knex migrate:make --knexfile knexfile.ts -x ts <your-migration-name>
  1. Führen Sie die Migrationsdatei aus
knex migrate:latest --knexfile knexfile.ts 
  1. Seed-Datei generieren
knex seed:make --knexfile knexfile.ts -x ts <your-seed-name>
  1. Führen Sie die Startdatei aus
knex seed:run --knexfile knexfile.ts 

Das --knexfile knexfile.ts ist nicht erforderlich, wenn Sie knexfile.js da das Typoskript keine Typprüfung für die Konfigurationsdatei für Sie bereitstellen kann.

Gibt es Pläne, das zu beheben? Es war schwierig, die Akzeptanz von Knex mit diesem Problem zu erhöhen: /

@dgadelha Danke für die Erinnerung! Ich werde heute oder morgen einen Blick darauf werfen.

@dgadelha 0.17.6 mit Fix dafür wurde veröffentlicht. Leider ist das Update zum Auflösen der Erweiterung von der knexfile-Erweiterung nur auf dem Master verfügbar (ab sofort).

Heute wurde auch bemerkt, dass knex --knexfile knexfile.ts migrate:make (...) eine .js-Datei anstelle von .ts erstellt. (Wenn knex zuvor automatisch knexfile.ts , werden auch automatisch .ts-Migrationen erzeugt.)

@kibertoad Gerade installiert 0.17.6 und dieses Verhalten tritt immer noch auf, selbst wenn ".ts" in der Knex-Datei angegeben wird. Sind sie separate Fehler?

@mathieumg Ja. Siehe PR, die ich vor ein paar Minuten erstellt habe und auf die in dieser Ausgabe verwiesen wird: D.

@kibertoad Ich habe! Die Beschreibung lässt es so klingen, als ob es eher darum ging, auf die Erweiterung zu schließen, die auf derselben Erweiterung wie die Knex-Datei basiert, also war ich mir nicht sicher.

The description makes it sounds like that was rather for inferring the extension based on the same extension as the Knexfile -> Nun ja, es geht darum, automatisch auf eine Erweiterung aus knexfile zu schließen, unabhängig davon, ob es sich um eine explizit angegebene oder eine automatisch aufgelöste handelt.
0.17.6 feste automatische Auflösung von TS-Kniedateien.

In Ordung! Weil 0.17.6 mit extension: "ts" immer noch das Ergebnis ".js" ergab. Vielen Dank für die Behebung dieser Fehler! 😄

Weil 0.17.6 mit der Erweiterung: "ts" immer noch das Ergebnis ".js" ergab

Ah, du meinst, du hast eine Kniedatei, die hat

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

drin? Dieser Fehler wurde in https://github.com/tgriesser/knex/commit/a65a95bc672563e01c08b40384e1dc2b079ecee1 behoben. Sie können bereits darauf zugreifen, indem Sie Ihre Version bei diesem Commit sperren (wenn Sie nicht direkt auf den Master zeigen möchten).
Leider wird es nicht auf 0.17 zurückportiert

0.18.0 ist noch ziemlich weit vorne, aber wenn je nach Commit keine Option für Sie ist, könnte ich stattdessen next-1 veröffentlichen.

Hey, ich habe die PR kommentiert, vielen Dank!

@kibertoad Super , danke für die Präzision! Wir können auf 0,18 warten, kein Stress. 😄

@kibertoad Das Commit, auf das Sie verweisen, funktioniert nur, wenn es direkt unter definiert ist

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

Das Migrationsobjekt, das definiert, wo Migrationen abgelegt und von diesen gelesen werden sollen, muss jedoch unter definiert werden

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

Wenn ich das Objekt migrations aus dem Umgebungsobjekt verschiebe, wird das Migrationsverzeichnis ignoriert.

@ViggoV Danke für den Fehlerbericht! Ich werde versuchen, dies heute anzusprechen.

@ViggoV Können Sie den neuesten Master ausprobieren und

Veröffentlicht in 0.18.0-next2

Entschuldigung, ich bin zu { ext: 'ts' } was wie erwartet funktioniert, aber nicht dokumentiert zu sein scheint. Ich werde testen, wenn ich Zeit habe

Hallo, ich hatte das gleiche Problem. Ich habe das Erfordernis von ts-node / register in meiner knexfile.ts wie folgt gelöst

`
erfordern ('ts-Knoten / Register')
const s = require ("./ settings.js");
module.exports = {

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

}}
};

`

Ich weiß nicht, ob Sie das Problem bereits gelöst haben, aber in meinem Fall war die Lösung sehr einfach. Ich verschiebe einfach die Datei _knexfile.js_ in das Stammverzeichnis des Projekts. Ich habe die Knex im Verzeichnis "/ backend" installiert, aber aus unbekannten Gründen wurde die Datei in ein anderes Verzeichnis verschoben. Also habe ich knexfile.js nach "backend / knexfile.js" verschoben und arbeite wie ein Zauber. Ich hoffe, es wird für jemanden nützlich sein.

Hallo @moacirandretti , meine knexfile.ts ist im Root-Projekt, aber cli heroku heroku run knex --knexfile knexfile.ts migrate: latest
Diese Nachricht zurückgeben.

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)

Ich habe dieses Paket ts-node in dev-Abhängigkeit installiert

Ich hatte den gleichen Fehler.
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 };

Wenn ich knex migrate:make user ausführe, ist ein Fehler aufgetreten, aber wenn ich knex migrate:make --migrations-directory ./scr/migrations -x ts user ausführe, wie in diesem Kommentar erwähnt .

Typoskript: 4.0.2
Knie: 0,21,5
@ types / knex: 0.16.1

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen