Knex: migrate: make gagal dengan TypeScript

Dibuat pada 18 Jan 2019  ·  27Komentar  ·  Sumber: knex/knex

Lingkungan Hidup

Versi Knex: 0.16.3 (Menggunakan TypeScript knexfile)
Database + versi: PostgreSQL 10.5
OS: Windows 10 Pro 64 Bit

Bug

Saat menjalankan knex migrate:make somename , ini adalah outputnya:

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)

Ini adalah konten dari knexfile.ts :

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

Beberapa detail tambahan:

  • knex migrate:make somename berfungsi jika saya mengubah ekstensi knexfile menjadi .js . (knex 0.16.3)
  • knex migrate:make somename berfungsi seperti seharusnya dengan knexfile TypeScript saat menggunakan paket knex 0.15.1 dan @types/knex 0.15.1.
  • Saya belum mencoba mesin database yang berbeda atau versi antara knex 0.15.1 - 0.16.3.
bug migrations

Komentar yang paling membantu

Kami juga menggunakan Knex untuk menulis kueri ke server PostgreSQL. Kami menemukan bahwa cara terbaik untuk menghasilkan adalah sebagai berikut.

  1. Hasilkan File Migrasi
knex migrate:make --knexfile knexfile.ts -x ts <your-migration-name>
  1. Jalankan File Migrasi
knex migrate:latest --knexfile knexfile.ts 
  1. Hasilkan File benih
knex seed:make --knexfile knexfile.ts -x ts <your-seed-name>
  1. Jalankan File seed
knex seed:run --knexfile knexfile.ts 

--knexfile knexfile.ts tidak akan diperlukan jika Anda menggunakan knexfile.js karena skrip ketikan tidak dapat menyediakan jenis pemeriksaan file konfigurasi untuk Anda.

Semua 27 komentar

Saya pikir ini mungkin terkait: https://github.com/tgriesser/knex/issues/2998
Saya dapat mengonfirmasi bahwa ini berfungsi dengan 0.15.2 , tetapi tidak dengan 0.16.x

Saya pikir ini mungkin terkait: # 2998
Saya dapat mengonfirmasi bahwa ini berfungsi dengan 0.15.2, tetapi tidak dengan 0.16.x

Tidak, ini masalah yang berbeda. dan saya dapat mengonfirmasi bahwa # 2998 tidak dapat direproduksi dengan informasi yang diberikan.

Kedengarannya seperti penyelesaian knexfile otomatis tidak mencari knexfile.ts, Anda dapat meneruskan argumen --knexfile knexfile.ts ke perintah atau memberikan jalur langsung ke perintah generator migrasi dengan:

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

Saya kira klien harus mencari knexfile.ts secara otomatis.

Saya pertama kali memperhatikan ini dengan migrate:latest , yang menarik kesalahan yang berbeda dari migrate:make . Berikut adalah repro sederhana tempat Anda dapat melihat keduanya: https://github.com/jrr/knex-ts-issue-repro

Juga perhatikan hari ini bahwa knex --knexfile knexfile.ts migrate:make (...) akan membuat file .js daripada .ts. (sebelumnya, ketika knex secara otomatis mengambil knexfile.ts , itu juga akan secara otomatis menghasilkan migrasi .ts)

Kami juga menggunakan Knex untuk menulis kueri ke server PostgreSQL. Kami menemukan bahwa cara terbaik untuk menghasilkan adalah sebagai berikut.

  1. Hasilkan File Migrasi
knex migrate:make --knexfile knexfile.ts -x ts <your-migration-name>
  1. Jalankan File Migrasi
knex migrate:latest --knexfile knexfile.ts 
  1. Hasilkan File benih
knex seed:make --knexfile knexfile.ts -x ts <your-seed-name>
  1. Jalankan File seed
knex seed:run --knexfile knexfile.ts 

--knexfile knexfile.ts tidak akan diperlukan jika Anda menggunakan knexfile.js karena skrip ketikan tidak dapat menyediakan jenis pemeriksaan file konfigurasi untuk Anda.

Ada rencana untuk memperbaikinya? Sulit untuk meningkatkan adopsi Knex dengan masalah ini: /

@dgadelha Terima kasih atas pengingatnya! Saya akan melihatnya hari ini atau besok.

@dgadelha 0.17.6 dengan perbaikan untuk ini telah dirilis. Sayangnya, perbaikan untuk menyelesaikan ekstensi dari ekstensi knexfile hanya akan tersedia di master (mulai sekarang).

Juga perhatikan hari ini bahwa knex --knexfile knexfile.ts migrate:make (...) akan membuat file .js daripada .ts. (sebelumnya, ketika knex secara otomatis mengambil knexfile.ts , itu juga akan secara otomatis menghasilkan migrasi .ts)

@kibertoad Baru saja menginstal 0.17.6 dan perilaku tersebut masih terjadi, bahkan saat menentukan ".ts" di Knexfile. Apakah mereka memisahkan bug?

@Ya . Lihat PR yang saya buat beberapa menit lalu dan direferensikan dari masalah ini: D

@kibertoad Saya lakukan! Deskripsi membuatnya terdengar seperti itu untuk menyimpulkan ekstensi berdasarkan ekstensi yang sama dengan Knexfile, jadi saya tidak yakin.

The description makes it sounds like that was rather for inferring the extension based on the same extension as the Knexfile -> ya, ini tentang secara otomatis menyimpulkan ekstensi dari knexfile, tidak peduli apakah itu secara eksplisit ditentukan atau yang dipecahkan secara otomatis.
0.17.6 solusi otomatis tetap dari file knex TS.

Baik! Karena 0.17.6 dengan extension: "ts" masih memberikan hasil ".js". Terima kasih telah memperbaiki bug itu! 😄

Karena 0.17.6 dengan extension: "ts" masih memberikan hasil ".js"

Ah, maksudmu kamu punya knexfile yang punya

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

di dalamnya? Yang itu telah diperbaiki di https://github.com/tgriesser/knex/commit/a65a95bc672563e01c08b40384e1dc2b079ecee1 , Anda sudah dapat mengaksesnya dengan mengunci versi Anda pada komit ini (jika Anda tidak ingin menunjuk ke master secara langsung).
Sayangnya itu tidak akan di-backport ke 0.17

0.18.0 masih cukup maju, tetapi jika bergantung pada komit bukan pilihan untuk Anda, saya bisa merilis next-1 sebagai gantinya.

Hei, saya sudah mengomentari PR, terima kasih banyak!

@kibertoad Luar biasa, terima kasih atas ketepatannya! Kami bisa menunggu 0.18, tanpa stres. 😄

@kibertoad Komit yang Anda rujuk hanya berfungsi jika didefinisikan langsung di bawah

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

Tetapi objek migrasi yang menentukan tempat meletakkan, dan membaca, migrasi harus ditentukan di bawah

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

Jika saya memindahkan objek migrations keluar dari objek lingkungan direktori migrasi akan diabaikan.

@ViggoV Terima kasih atas laporan

@ViggoV Dapatkah Anda mencoba master terbaru dan melaporkan kembali jika berfungsi dengan benar dalam kasus Anda sekarang?

Dirilis pada 0.18.0-next2

Maaf, saya akhirnya beralih ke { ext: 'ts' } yang berfungsi seperti yang saya harapkan tetapi sepertinya tidak didokumentasikan. Saya akan menguji kapan saya punya waktu

Hai, saya punya masalah yang sama. Saya menyelesaikan membutuhkan ts-node / register di knexfile.ts saya seperti ini

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

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

}
};

`

Saya tidak tahu apakah Anda sudah menyelesaikan masalah tetapi dalam kasus saya solusinya sangat sederhana. Saya baru saja memindahkan _knexfile.js_ ke root proyek. Saya menginstal knex di direktori "/ backend" tetapi karena alasan yang tidak diketahui file tersebut dipindahkan ke direktori lain. Jadi saya memindahkan knexfile.js ke "backend / knexfile.js" dan bekerja seperti pesona. Semoga bermanfaat bagi seseorang.

Hi @moacirandretti, knexfile.ts saya itu dalam proyek root, tapi cli heroku heroku run knex --knexfile knexfile.ts migrate: latest
kembalikan pesan ini.

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)

Saya menginstal paket ts-node ini dalam ketergantungan dev

Saya menghadapi kesalahan yang sama.
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 };

ketika saya menjalankan knex migrate:make user Saya mendapat kesalahan, tetapi ketika saya menjalankan knex migrate:make --migrations-directory ./scr/migrations -x ts user seperti yang disebutkan oleh komentar ini .

Naskah: 4.0.2
knex: 0.21.5
@ tipe / knex: 0.16.1

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

nklhrstv picture nklhrstv  ·  3Komentar

mishitpatel picture mishitpatel  ·  3Komentar

legomind picture legomind  ·  3Komentar

saurabhghewari picture saurabhghewari  ·  3Komentar

fsebbah picture fsebbah  ·  3Komentar