Versi Knex: 0.16.3 (Menggunakan TypeScript knexfile)
Database + versi: PostgreSQL 10.5
OS: Windows 10 Pro 64 Bit
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 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.
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
--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).
Harap tinjau!
https://github.com/tgriesser/knex/pull/3282
Juga perhatikan hari ini bahwa
knex --knexfile knexfile.ts migrate:make (...)
akan membuat file .js daripada .ts. (sebelumnya, ketika knex secara otomatis mengambilknexfile.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
Komentar yang paling membantu
Kami juga menggunakan
Knex
untuk menulis kueri ke server PostgreSQL. Kami menemukan bahwa cara terbaik untuk menghasilkan adalah sebagai berikut.--knexfile knexfile.ts
tidak akan diperlukan jika Anda menggunakanknexfile.js
karena skrip ketikan tidak dapat menyediakan jenis pemeriksaan file konfigurasi untuk Anda.