<p>knex 0.16 tidak mendukung knexfiles yang ditulis dalam TypeScript</p>

Dibuat pada 14 Jan 2019  ·  85Komentar  ·  Sumber: knex/knex

Lingkungan

Versi Knex: 0.16.3
Basis data + versi: buruh pelabuhan postgres:10.4
OS: Windows 10 Pro & Docker node:8.14.0

Serangga

  1. knex migrate:make --knexfile knexfile.ts
  2. Pesan kesalahan: Unexpected token import

Bekerja normal pada 0.15.x

Komentar yang paling membantu

Saya menghadapi masalah yang sama dengan Knex versi 0.16.3 .

import * as Knex from 'knex';
^^^^^^

SyntaxError: Unexpected token import
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:617:28)
    at Object.Module._extensions..js (module.js:664:10)

Solusi ini tidak dianjurkan tetapi saya hanya memperbaikinya dengan hanya menambahkan ts-node/register di awal file knexfile.ts .

require('ts-node/register');
//

Semua 85 komentar

0.16 sekarang memiliki tipe TypeScript yang disertakan dalam repo (lihat #2845 ). Anda mungkin perlu menghapus @types/knex dari proyek Anda agar ini berfungsi dengan benar.

Saya menghapus @types/knex tetapi saya masih mendapatkan kesalahan.

/usr/src/app/src/db/knexfile.ts:1
(function (exports, require, module, __filename, __dirname) { import { database } from '../config'
                                                              ^^^^^^

SyntaxError: Unexpected token import
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:617:28)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at initKnex (/usr/src/app/node_modules/knex/bin/cli.js:62:25)
    at Command.commander.command.description.option.action (/usr/src/app/node_modules/knex/bin/cli.js:172:24)
    at Command.listener (/usr/src/app/node_modules/commander/index.js:315:8)
    at emitTwo (events.js:126:13)
    at Command.emit (events.js:214:7)
    at Command.parseArgs (/usr/src/app/node_modules/commander/index.js:654:12)
    at Command.parse (/usr/src/app/node_modules/commander/index.js:474:21)

knex migrate:make --knexfile knexfile.ts bukankah itu mencoba menjalankan kode TypeScript dengan simpul biasa? Saya juga tidak tahu bagaimana itu bisa bekerja dengan 0,15.

Bagaimana tampilan knexfile Anda? apakah ada pernyataan impor?

import * as knex from 'knex'
import * as path from 'path'
import { env } from './env'

const database = {
  client: 'postgresql',
  connection: env.databaseUrl,
  migrations: {
    directory: path.resolve('../db/migrations'),
    tableName: 'knex_migrations',
  },
  seeds: {
    directory:  path.resolve('../db/seeds'),
  },
} as knex.Config

export = database

bekerja 100% pada 0.15

Saya tidak tahu mengapa itu akan berhasil dengan 0,15. Seperti yang dikatakan oleh kesalahan Unexpected token import , import * as knex from 'knex' tidak dipahami oleh Node.js (setidaknya tidak dalam konfigurasi yang Anda gunakan).

Anda harus mengompilasi knexfile Anda ke JavaScript, menggunakan versi Node.js yang memahami sintaks impor (lihat https://nodejs.org/api/esm.html ), atau kembalikan file untuk menggunakan require() lama

Saya kira ada bug di knex 0.15 sehingga tidak pernah membaca knexfile itu. Tidak terlihat seperti bug di 0.16 yang seharusnya tidak berfungsi.

sehingga tidak pernah membaca knexfile itu

Itu 100% membaca knexfile, saya menggunakannya di lebih dari satu proyek (dari atas kepala saya, saya dapat memikirkan 4, dalam produksi) dengan folder migrasi dan data koneksi yang berbeda.

Pada versi 0.15 itu dikompilasi atau mungkin menggunakan ts-node secara otomatis untuk menjalankan file.

Saya baru saja mengujinya ... Anda benar, kedua versi mencoba mendaftarkan hal-hal ts-node. Sepertinya fitur itu tidak diuji. Tidak yakin jika bahkan didokumentasikan.

tidak ... sekarang benar-benar mengujinya dengan hal-hal yang diperlukan diinstal pada node 8

Mikaels-MacBook-Pro-2:test mikaelle$ npm install [email protected] ts-node-register
npm WARN [email protected] No description
npm WARN [email protected] No repository field.

+ [email protected]
+ [email protected]
updated 2 packages and audited 1037 packages in 2.135s
found 0 vulnerabilities

Mikaels-MacBook-Pro-2:test mikaelle$ echo "import * as knex from 'knex'; export = {client: 'pg'}" > knexfile.ts
Mikaels-MacBook-Pro-2:test mikaelle$ node_modules/.bin/knex migrate:make --knexfile knexfile.ts -x ts foo
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 @babel/register
/Users/mikaelle/Projects/Vincit/yessql/dodo-objection/test/knexfile.ts:1
(function (exports, require, module, __filename, __dirname) { import * as knex from 'knex'; export = {client: 'pg'}
                                                              ^^^^^^

SyntaxError: Unexpected token import

tidak dapat mereproduksi, tetapi fitur ini sangat memungkinkan untuk diimplementasikan, karena knex sudah menggunakan ts-node untuk mengkompilasi file dan seed migrasi TypeScript yang sebenarnya

Saya telah menyiapkan contoh lengkap jika Anda ingin menyelidiki mengapa ini berfungsi pada 0,15 dan bukan pada 0,16

Cabang: knex16 telah menginstal 0.16.3
https://github.com/brunolm/knex16bug/tree/knex16

Cabang: knex15 telah menginstal 0.15.2
https://github.com/brunolm/knex16bug/tree/knex15

Beralih ke cabang yang ingin Anda periksa dan jalankan di folder root:

docker-compose up

Jika berhasil, Anda akan melihat migrasi bernama test di /api/src/db/migrations

setelah menginstal juga beberapa paket lagi (ts-node ts-node-dev TypeScript) tampaknya keduanya, 0,15 dan 0,16 berfungsi dengan baik di sini ... tetapi memang pengaturan buruh pelabuhan Anda dengan simpul 0,16 gagal dan saya tidak tahu mengapa

Mikaels-MacBook-Pro-2:test mikaelle$ rm -fr node_modules/*
Mikaels-MacBook-Pro-2:test mikaelle$ npm install knex typescript ts-node
npm WARN [email protected] No description
npm WARN [email protected] No repository field.

+ [email protected]
+ [email protected]
+ [email protected]
added 295 packages from 184 contributors and audited 1213 packages in 6.59s
found 0 vulnerabilities

Mikaels-MacBook-Pro-2:test mikaelle$ node_modules/.bin/knex migrate:make --knexfile knexfile.ts test
Requiring external module ts-node/register
Created Migration: /xxx/migrations/20190119003358_test.js
Mikaels-MacBook-Pro-2:test mikaelle$ cat knexfile.ts 
import * as knex from 'knex'; export = {client: 'pg'}
Mikaels-MacBook-Pro-2:test mikaelle$ 

Saya memodifikasi docker-compose.yml Anda menjadi hampir sama dan gagal seperti ini:

version: '3'

services:
  api:
    image: node:8.14.0
    command: bash -c 'rm -fr api/node_modules; npm i knex ts-node typescript; node_modules/.bin/knex migrate:make --knexfile ./src/db/knexfile.ts test'
    working_dir: /usr/src/app
    volumes:
      - ./api:/usr/src/app
api_1  | npm WARN [email protected] No repository field.
api_1  | 
api_1  | + [email protected]
api_1  | + [email protected]
api_1  | + [email protected]
api_1  | updated 3 packages and audited 1176 packages in 9.804s
api_1  | found 0 vulnerabilities
api_1  | 
api_1  | /usr/src/app/src/db/knexfile.ts:1
api_1  | (function (exports, require, module, __filename, __dirname) { import { database } from '../config'
api_1  |                                                               ^^^^^^
api_1  | 

Jika saya memindahkan knexfile di wadah Anda ke /usr/src/app, ia mencoba mengkompilasi dengan benar... Saya tidak dapat mereproduksi perilaku itu secara lokal. Di sini semuanya berfungsi bahkan jika knexfile.ts ada di dalam subdirektori...

Saya pikir saya mungkin menemukan bug pada 0.16, atau hanya sesuatu yang aneh.

Pada 0.15 launch dipanggil dengan configPath
https://github.com/tgriesser/knex/blob/0.15.2/bin/cli.js#L260

Tapi pada 0.16 itu disebut dengan

    knexfile: argv.knexfile,
    knexpath: argv.knexpath,

https://github.com/tgriesser/knex/blob/0.16.3/bin/cli.js#L303 -L304

LiftOff memanggil var env = this.buildEnvironment(opts); yang memanggil findConfig({ melewati configPath (yang tidak lagi disediakan). Secara internal ia menggunakan configPath dan tidak membuat referensi ke knexfile atau knexpath .


Saya telah menginstal typescript dan ts-node di proyek dan berfungsi ketika saya menginstal v0.15 (seperti contoh yang saya berikan di repositori Git.

Saya melakukan beberapa debugging dan menemukan ini, tetapi saya masih tidak tahu mengapa ini bekerja pada 0.15

[email protected]

Mencatat hasil dari baris ini

var config = require(env.configPath);

https://github.com/tgriesser/knex/blob/0.15.2/bin/cli.js#L55

Saya mengerti ini

api_1    |   require(/usr/src/app/src/db/knexfile.ts)------------ { client: 'postgresql',
api_1    |   connection: 'postgres://user:password@db/api-db',
api_1    |   migrations:
api_1    |    { directory: '/usr/src/app/src/db/migrations1337',
api_1    |      tableName: 'knex_migrations' },
api_1    |   seeds: { directory: '/usr/src/app/src/db/seeds' } }
api_1    | this.config { extension: 'js',
api_1    |   loadExtensions:
api_1    |    [ '.co',
api_1    |      '.coffee',
api_1    |      '.eg',
api_1    |      '.iced',
api_1    |      '.js',
api_1    |      '.litcoffee',
api_1    |      '.ls',
api_1    |      '.ts' ],
api_1    |   tableName: 'knex_migrations',
api_1    |   schemaName: null,
api_1    |   directory: '/usr/src/app/src/db/migrations1337',
api_1    |   disableTransactions: false }

Direktori migrasi mengatakan directory: '/usr/src/app/src/db/migrations1337', , yang persis seperti yang saya miliki di knexfile.ts

Dan itu secara langsung membutuhkan file .ts

require('/usr/src/app/src/db/knexfile.ts')

[email protected]

Persyaratannya adalah file yang sama persis, tetapi gagal

// /usr/src/app/src/db/knexfile.ts
env.configuration = require(resolvedKnexfilePath);

[email protected]

Saya menghapus typescript dan ts-node . Sekarang saya mendapatkan ini:

api_1    | Failed to load external module ts-node/register
api_1    | Failed to load external module typescript-node/register
api_1    | Failed to load external module typescript-register
api_1    | Failed to load external module typescript-require
api_1    | Failed to load external module @babel/register
cli.on('requireFail', function(name) {
  console.log(chalk.red('Failed to load external module'), chalk.magenta(name));
});

https://github.com/tgriesser/knex/blob/0.15.2/bin/cli.js#L254

Saya tidak melihat pesan ini sama sekali pada tanggal 16, hanya rusak.

@elhigu saya tahu, saya membuat PR, bisakah Anda memeriksanya?
https://github.com/tgriesser/knex/pull/3005

Dibuka kembali karena ini mungkin adalah bug di suatu tempat ... bahkan saya tidak tahu cara mereproduksinya di osx.

FYI, saya menjalankan contoh brunolm dan knex 0.15.2 berfungsi sementara knex 0.16.3 tidak berfungsi

@scorbin ya, saya dapat mereproduksinya juga dengan buruh pelabuhan, tetapi tidak secara lokal di osx. Itu sebabnya saya membuka kembali ini.

Masalah yang sama di sini (migrasi TypeScript + 0.16.3).
Ketika Migrator#latest dipanggil, itu dimulai dengan migrationListResolver#listAllAndCompleted yang pada gilirannya memanggil listAll(config.migrationSource) mana migrationSource memiliki loadExtensions = [".co", ".coffee", ".eg", ".iced", ".js", ".litcoffee", ".ls", ".ts"] , bahkan jika saya { …, loadExtensions: ['.js'], … } dalam konfigurasi migrasi.
Akibatnya, ia mengambil file .ts dan .js dan memberitahu migrasi untuk melanjutkan dengan file .ts (karena mereka diberitahu untuk belum diterapkan, jelas), yang... rusak ketika #getMigration akhirnya dipanggil untuk mengevaluasi skrip (karena ia memanggil #require dengan skrip migrasi yaitu TypeScript).

Semoga ini membantu...

Dengan sedikit perubahan berikut, semuanya tampak kembali normal:

function listAllAndCompleted(config, trxOrKnex) {
  return _bluebird.default.all([listAll(config.migrationSource, config.loadExtensions), listCompleted(config.tableName, config.schemaName, trxOrKnex)]);
}

Saya tidak memvalidasinya 100% sesuai dengan desain migran - yang lebih berpengetahuan dari saya harus memvalidasi! :)

Saya menghadapi masalah yang sama dengan Knex versi 0.16.3 .

import * as Knex from 'knex';
^^^^^^

SyntaxError: Unexpected token import
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:617:28)
    at Object.Module._extensions..js (module.js:664:10)

Solusi ini tidak dianjurkan tetapi saya hanya memperbaikinya dengan hanya menambahkan ts-node/register di awal file knexfile.ts .

require('ts-node/register');
//

Harus diperbaiki di 0.16.4-next2

Baru saja mencoba 0.16.4-next2. Sedih melihat kesalahan yang sama

@brunolm dapatkah Anda mengonfirmasi bahwa 0.16.4-next2 masih gagal?

@pvoisin Apakah ini bekerja untuk Anda dengan 0.16.4-next2?

@kibertoad Saya mendapatkan kesalahan yang sama persis pada 0.16.4-next2.

OK, jadi perbaikan yang tepat untuk ini adalah dengan sepenuhnya menghapus ketergantungan pada knexfile dari migrasi: make (karena tidak benar-benar membutuhkannya).

Saya tidak ingin mengalahkan kuda yang mati, tetapi @kibertoad mengatakan itu _harus_ diperbaiki. Di mana bukti perbaikan ini? Apakah tes regresi telah ditulis? Mengatakan itu harus diperbaiki, menutup masalah, dan menghadirkan masalah yang sama bukanlah cara rilis harus didorong.

@juliancoleman ini sulit untuk direproduksi. Tapi memang seharusnya ada tes regresi yang ditambahkan dalam perbaikan (tidak memeriksa apakah benar-benar ada dan tes tidak gagal pada ci env).

Sulit untuk mereproduksi sebenarnya adil karena saya telah melihat ke belakang dan telah melihat bahwa tidak seorang pun, termasuk saya sendiri, telah menambahkan langkah-langkah untuk mereproduksi.

  1. Tambahkan [email protected] ke dependensi
  2. Buat knexfile.ts
  3. (opsional menggunakan ObjectionJS) instantiate knex config pada Model.knex
  4. Tambahkan skrip berikut ke package.json

    • "knex": "knex --knexfile ./path/to/Knexfile.ts"

  5. Lakukan migrasi

    • yarn knex migrate:latest

  6. Jalankan ke SyntaxError

Saya telah memverifikasi langkah-langkah ini pada proyek yang baru saya mulai beberapa hari yang lalu, yang membawa saya ke masalah ini

    "knex": "^0.16.4-next2",
git clone [email protected]:brunolm/knex16bug.git
cd knex16bug
git checkout knex16
npm run api-i
docker-compose up
api_1    | > knex migrate:make --knexfile ./src/db/knexfile.ts "test"
api_1    |
api_1    | /usr/src/app/src/db/knexfile.ts:1
api_1    | (function (exports, require, module, __filename, __dirname) { import { database } from '../config'
api_1    |                                                               ^^^^^^
api_1    |
api_1    | SyntaxError: Unexpected token import
api_1    |     at createScript (vm.js:80:10)
api_1    |     at Object.runInThisContext (vm.js:139:10)
api_1    |     at Module._compile (module.js:617:28)
api_1    |     at Object.Module._extensions..js (module.js:664:10)
api_1    |     at Module.load (module.js:566:32)
api_1    |     at tryModuleLoad (module.js:506:12)
api_1    |     at Function.Module._load (module.js:498:3)
api_1    |     at Module.require (module.js:597:17)
api_1    |     at require (internal/module.js:11:18)
api_1    |     at initKnex (/usr/src/app/node_modules/knex/bin/cli.js:62:25)
api_1    |     at Command.commander.command.description.option.action (/usr/src/app/node_modules/knex/bin/cli.js:172:24)
api_1    |     at Command.listener (/usr/src/app/node_modules/commander/index.js:315:8)
api_1    |     at emitTwo (events.js:126:13)
api_1    |     at Command.emit (events.js:214:7)
api_1    |     at Command.parseArgs (/usr/src/app/node_modules/commander/index.js:654:12)
api_1    |     at Command.parse (/usr/src/app/node_modules/commander/index.js:474:21)
api_1    | npm ERR! code ELIFECYCLE
api_1    | npm ERR! errno 1
api_1    | npm ERR! [email protected] migrate-make: `knex migrate:make --knexfile ./src/db/knexfile.ts "test"`
api_1    | npm ERR! Exit status 1
api_1    | npm ERR!
api_1    | npm ERR! Failed at the [email protected] migrate-make script.
api_1    | npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
api_1    |
api_1    | npm ERR! A complete log of this run can be found in:
api_1    | npm ERR!     /root/.npm/_logs/2019-03-18T21_39_10_408Z-debug.log

PR saya memperbaikinya, saya hanya tidak memiliki pengetahuan untuk mengujinya sepenuhnya dll, jika seseorang dapat memeriksanya ...

https://github.com/tgriesser/knex/pull/3005

Saya tidak ingin mengalahkan kuda yang mati, tetapi @kibertoad mengatakan itu harus diperbaiki. Di mana bukti perbaikan ini? Apakah tes regresi telah ditulis? Mengatakan itu harus diperbaiki, menutup masalah, dan menghadirkan masalah yang sama bukanlah cara rilis harus didorong.

Saya minta maaf, ini sudah larut malam di Amsterdam dan pilihan kata-kata saya benar-benar bukan yang terbaik. Seharusnya "Tolong beri tahu saya jika 0.16.4-next2 memperbaiki masalah", karena, TBH, saya akan sangat terkejut jika itu terjadi. Ada tes unit tertulis yang memverifikasi dengan tepat apa yang sebenarnya diperbaiki oleh perbaikan ini, dan sekarang saya cukup yakin bahwa saya tidak salah paham tentang apa pun dan masalah itu persis seperti yang saya pikirkan, dan satu-satunya cara bagaimana itu bisa bekerja sebelumnya adalah melalui melewati knexfile sepenuhnya. Ini adalah perilaku sistem yang ingin saya tingkatkan dalam waktu dekat, tetapi memerlukan sedikit prasyarat untuk disampaikan sebelumnya. Saya mohon maaf atas ketidaknyamanan ini. Beri aku waktu. Sementara itu, menggunakan ts-node tampaknya menjadi solusi yang tepat - orang mungkin berpendapat bahwa itu sebenarnya kurang hacky daripada tidak tergantung pada knexfile, karena memungkinkan Anda untuk menggunakan knexfile sebagai satu sumber kebenaran mengenai lokasi file migrasi.

@kibertoad

dan satu-satunya cara bagaimana itu bisa bekerja sebelumnya adalah dengan melewati knexfile sepenuhnya.

Ini tidak benar, lihat komentar saya sebelumnya. Semuanya bekerja pada 0.15.

@brunolm Tapi bisakah Anda menjelaskan pada tingkat teknis bagaimana Node.js mungkin tidak tersedak saat mem-parsing file TypeScript bahkan secara hipotetis? Saya akan memeriksa PR, tetapi saya menduga bahwa itu mencapai hal yang sama pada akhirnya (meskipun dengan cara yang berbeda) - melewati knexfile.

@kibertoad Saya saat ini menggunakan ts-node. Saya tidak yakin mengapa ini terjadi pada tingkat teknis

Jika saya punya waktu untuk memeriksa sumbernya, saya akan melakukannya, tetapi saya telah menggunakan Knex selama bertahun-tahun dan saya percaya itu berfungsi pada saat ini. Saya kembali ke 0,15 dan semuanya berfungsi ... Kecuali ini, tentu saja

@brunolm Tapi bisakah Anda menjelaskan pada tingkat teknis bagaimana Node.js mungkin tidak tersedak saat mem-parsing file TypeScript bahkan secara hipotetis? Saya akan memeriksa PR, tetapi saya menduga bahwa itu mencapai hal yang sama pada akhirnya (meskipun dengan cara yang berbeda) - melewati knexfile.

jika Anda melakukan ini, Anda dapat melihatnya bekerja sepenuhnya di knex 0.15 , tidak mengabaikan file knexfile.ts

git clone [email protected]:brunolm/knex16bug.git
cd knex16bug
git checkout knex15
npm run api-i
docker-compose up

namun jika Anda menjalankan hal yang sama persis di knex 0.16 Anda akan melihat kesalahannya. Jika Anda mengkloning ini, saya sarankan mengkloning di folder yang berbeda sehingga Anda dapat memastikan Anda menggunakan versi yang benar

git clone [email protected]:brunolm/knex16bug.git
cd knex16bug
git checkout knex16
npm run api-i
docker-compose up

Saya memverifikasi contoh-contoh @brunolm sebelumnya saya tidak pernah dapat membuat kasus reproduksi untuk ini yang akan gagal pada macos, tetapi saya dapat mereproduksi pengaturan buruh pelabuhan.

Jadi masalahnya saat ini adalah dapat membuat test case untuk knex CI, yang sebenarnya juga gagal pada 0,16 dan bekerja dengan 0,15. Karena CI menjalankan beberapa ubuntu lama, mungkin test case itu berfungsi (artinya gagal) di sana dengan baik.

Pembaruan cepat di pihak saya. Tidak yakin apakah ini berguna atau tidak, tetapi masalah saya adalah saya menggunakan beberapa file tsconfig.json dalam proyek saya, dan knex menggunakan default. Ketika saya mengesampingkan fungsi ini dengan langsung meluncurkan knex menggunakan ts-node , saya dapat mengatasi kesalahan ini.

package.json saya yang diperbarui :

// ...
"knex": "ts-node --project tsconfig.server.json $(npm bin)/knex --knexfile ./src/server/knexfile.ts",
// ...

Bagaimana saya menjalankan migrasi sekarang:

npm run knex -- migrate:latest

Semoga ini bisa membantu seseorang.

@FindAPattern maukah Anda memposting tsconfig Anda? Ini milikku. Saya hanya menggunakan satu, karena saya tidak perlu membangun karena saya melayani dengan ts-node

{
  "compilerOptions": {
    "noEmit": true,
    "rootDir": "src",
    "target": "es6",
    "module": "commonjs",
    "moduleResolution": "node",
    "declaration": true,
    "inlineSourceMap": true,
    "resolveJsonModule": true,
  },
  "include": [
    "src/**/*.ts",
  ],
  "exclude": [
    "src/**/*.spec.ts"
  ]
}

Hai! Apakah ada kemajuan dalam hal ini?

@brunolm Bagaimana Anda mengatasinya? Ada solusi?

@algil Saya belum perlu memperbarui atau memulai proyek baru, jadi saya masih menggunakan 0,15 untuk sebagian besar.

Tapi saya memang membuat PR yang memecahkan masalah ini, Anda dapat melakukan fork knex dan menerapkan perubahan ini padanya: https://github.com/tgriesser/knex/pull/3005

Ini tidak begitu sederhana, sayangnya. Saya akan mencoba membuat perbaikan yang tidak merusak kasus penggunaan apa pun minggu ini.

Mungkin itu akan membantu seseorang. Diperbaiki saat mengubah "modul" tsconfig.json: "es2015" menjadi "modul": "commonjs"
Perintah di package.json => "migrate": "ts-node -P ./tsconfig.json node_modules/.bin/knex migration :latest --knexfile knexfile.ts".

Mungkin itu akan membantu seseorang. Diperbaiki saat mengubah "modul" tsconfig.json: "es2015" menjadi "modul": "commonjs"
Perintah di package.json => "migrate": "ts-node -P ./tsconfig.json node_modules/.bin/knex migration :latest --knexfile knexfile.ts".

Bukan solusi optimal tetapi berfungsi dengan baik.

@Areshetcov @Meldiron Saya telah menggunakan modul commonjs seperti yang Anda lihat di atas . Saya pikir apa yang sebenarnya perlu terjadi adalah dukungan yang lebih dalam, tidak harus menyebabkan banyak konfigurasi pengguna. Kecuali itu benar-benar bukan pilihan

Mempertimbangkan bagaimana masalah ini terkait dengan rilis yang sekarang ada di belakang, apakah ini saat ini menjadi masalah dengan 0.17.6 ?

@juliancoleman Menggunakan ts-node masih merupakan solusi terbaik, karena knex masih mencoba membuka knexfile.js dan meledak jika tidak dalam format Javascript. Namun, ada peningkatan untuk menangani ekstensi TS dengan lebih anggun dalam lebih banyak kasus (misalnya pembuatan migrasi atau penyelesaian knexfile di lokasi default). Masalah khusus apa yang Anda alami?

Bagaimanapun, terima kasih telah mengingatkan saya tentang masalah ini. Saya akan mencoba mengambil ayunan lain di akhir pekan, semoga saya setidaknya bisa mengerti mengapa itu berhasil di masa lalu: D

Ketika saya membuat PR itu, saya perhatikan bahwa itu seharusnya bekerja tidak hanya dengan TypeScript, tetapi juga dengan babel dan beberapa hal lainnya, ada paket yang menangani semua itu - jika saya ingat dengan benar.

PR saya mungkin memiliki beberapa petunjuk berguna https://github.com/tgriesser/knex/pull/3005/files

Masalah yang saya miliki adalah ketika saya menjalankan npm run knex migrate:latest , saya mendapatkan unexpected token '{' . Saya menggunakan ts-node hanya untuk API ini. Saya tidak menjalankannya melalui bundler apa pun dan saya tidak mengkompilasi TS. Mungkin bukan hal yang baik untuk _melakukannya, tapi itulah yang saya lakukan untuk saat ini. Namun, saya sadar bahwa TypeScript tidak dapat mengimpor file TypeScript pihak ketiga. Mereka harus dibangun terlebih dahulu. Saya pernah mengalami ini di tempat lain, tidak hanya dengan Knex

Namun, saya sadar bahwa TypeScript tidak dapat mengimpor file TypeScript pihak ketiga.

Maksud Anda ts-node tidak dapat memuat file TypeScript dengan require() ? Migrator menggunakan require() untuk memuat file migrasi tersebut secara dinamis...

Hanya menimpali di sini jika orang lain memiliki masalah yang sama dengan saya: Saya memiliki [email protected] dan mencoba menjalankan pada dasarnya* knex --knexfile src/knexfile.ts yang gagal karena tampaknya mencoba membaca knexfile sebagai JS. Menggunakan knex --cwd src berfungsi sebagaimana dimaksud.

*) commandline sebenarnya adalah node -r dotenv/config node_modules/knex/bin/cli [...] tapi itu mungkin tidak masalah.

@ilkka Bisakah Anda menjelaskan apa yang dimaksud dengan "berfungsi sebagaimana dimaksud" dalam konteks ini? Mempertimbangkan bahwa Anda menjalankan node dan bukan ts-node , itu bukan Knex yang gagal mengurai knexfile.ts, ini Node.js. Kecuali Anda bermaksud bahwa resolusi nama file tidak berfungsi dengan baik.
Apakah knex --cwd src benar-benar berhasil membuka knexfile yang dimaksud dan bereaksi dengan benar terhadap perubahan konfigurasi di dalamnya?

Ah, maaf kalau kurang jelas. Ketika saya menggunakan parameter --cwd saat menjalankan knex dari skrip npm saya, ia melaporkan "Memerlukan modul eksternal ts-node/register", membaca knexfile saya, dan berfungsi. Perilakunya sama jika saya menjalankannya sebagai npx knex , di luar skrip npm.

@ilkka Menarik. Saya tidak berpikir knex pernah mencoba memuat ts-node sendiri, jadi itu pasti sesuatu yang lain dari tumpukan yang Anda gunakan. Jika Anda dapat mengidentifikasi apa itu sebenarnya, akan mungkin untuk mengetahui apa yang kami lakukan untuk memutuskan kompatibilitas dengan itu.

Saya percaya pesan tentang membutuhkan modul dicetak oleh cli.js here , disebabkan oleh acara Liftoff (dari sebelum 'memerlukan' diubah namanya menjadi sesuatu yang lain di Liftoff). Liftoff pada gilirannya menggunakan paket yang disebut "rechoir" untuk mendaftarkan loader atau apa pun, dan README rechoir memiliki catatan ini tentang bagaimana ia akan "secara otomatis memuat dan mendaftarkan transpiler seperti coffee-script ". Jadi ... mungkin hanya memiliki ts-node di jalur saya dalam contoh khusus ini sudah cukup untuk membuat ini berfungsi? Ini adalah sistem yang cukup berbelit-belit.

Bagaimanapun, sekarang saya menyadari bahwa kita bisa saja mengubah node menjadi ts-node dalam skrip npm kita dan itu juga akan berhasil.

Terima kasih telah memeriksanya. Saya akan melihat apakah saya dapat membuat lepas landas berperilaku dalam kasus ini :D
tapi ya, menggunakan ts-node secara langsung harus bekerja di semua kasus.

Memiliki kesalahan yang sama. Ternyata saya salah menyalin tsconfig.json . Sekarang bekerja. Konfigurasi yang relevan:

package.json (ruang kerja)

  "scripts": {
    "migrate:make": "knex --cwd src migrate:make -x ts"
  },
  "dependencies": {
    "knex": "0.19.0",
    "pg": "7.11.0"
  }

package.json (root):

        "ts-node-dev": "1.0.0-pre.40",

(versi ts-node adalah: 8.3.0)

tsconfig.json (ruang kerja):

{
    "extends": "../../tsconfig.node.json",
    "compilerOptions": {
        "rootDir": "./src",
        "outDir": "./build",
    }
}

tsconfig.node.json (root):

{
    "compilerOptions": {
        "target": "es2015",
        "moduleResolution": "node",
        "esModuleInterop": true,
        "strict": true,
        "alwaysStrict": true,
        "declaration": true,
    }
}

src/knexfile.ts:

import { Config } from 'knex'

export = {
    client: 'pg',
    connection: {
      database: 'db',
      user: 'user',
    },
} as Config

Perintah untuk menjalankan:

yarn migrate:make my_migration_name

Masalah masih berlanjut pada [email protected]

git clone [email protected]:brunolm/knex16bug.git
cd knex16bug
git checkout knex19
npm run api-i
docker-compose up
api_1    | /usr/src/app/src/db/knexfile.ts:1
api_1    | (function (exports, require, module, __filename, __dirname) { import { database } from '../config'
api_1    |                                                               ^^^^^^ 

@brunolm kenapa kamu begitu bodoh?

diff --git a/api/package.json b/api/package.json
index c0f8bff..0906f51 100644
--- a/api/package.json
+++ b/api/package.json
@@ -8,7 +8,7 @@
     "dev": "ts-node-dev --respawn --poll --no-notify src/index.ts",
     "\n# Database": "",
     "migrate": "knex migrate:latest --knexfile ./src/db/knexfile.ts",
-    "migrate-make": "knex migrate:make --knexfile ./src/db/knexfile.ts",
+    "migrate-make": "knex migrate:make --cwd src/db",
     "seed": "knex seed:run --knexfile ./src/db/knexfile.ts",
     "seed-make": "knex seed:make --knexfile ./src/db/knexfile.ts",
     "\n# Testing": "",
api_1    | > [email protected] migrate-make /usr/src/app
api_1    | > knex migrate:make --cwd src/db "test"
api_1    | 
api_1    | Requiring external module ts-node/register
api_1    | Working directory changed to /usr/src/app/src/db
api_1    | Created Migration: /usr/src/app/src/db/migrations/20190723173751_test.ts

Menentukan --knexfile masih tidak berfungsi.

Menggunakan --cwd src/db sebagai gantinya berfungsi.

Dokumentasi tidak jelas bahwa Anda harus menggunakan cwd lebih dari knexfile .

Saya tidak memeriksa tanda tangan fungsi, ketika saya membuat PR itu saya ubah untuk melewati parameter yang benar, mungkin masih melewati parameter yang salah.

Halo kawan-kawan

Saya juga memiliki kesalahan ini
Saya pikir, masalahnya adalah opsi --knexfile salah mengatur direktori untuk knexfile.ts
Jadi saya menetapkan arah eksplisit dengan --cwd untuk direktori dengan knexfile.ts

Ini bekerja untuk saya: "knex migrate:make --cwd src"
(Ini sama dengan ini: "cd src knex migrate:make" )

Saya mencoba knex migrate:make --knexfile knexfile.ts -x ts new_script
Saya mendapatkan kesalahan berikut

impor knex dari 'knex';
^^^^
SyntaxError: Pengidentifikasi tak terduga

saat menambahkan cwd

internal/proses/main_thread_only.js:29
binding.chdir(direktori);

knexfile.ts saya terlihat seperti di bawah ini

import knex from 'knex';
export const database: knex.Config = {
  client: 'postgresql',
  connection: process.env.databaseURL,
  migrations: {
    extension: 'ts',
    directory: './ds/migrations',
  },
  seeds: {
    directory: './ds/seed',
  },
};

ada petunjuk?

Untuk sesama googler, saya mengalami kesalahan "ekspor token yang tidak terduga" ketika mencoba bermigrasi ke atas/bawah dengan knex 0.19 terbaru dalam mode TypeScript penuh.

Saya ternyata memiliki tsconfig.json dan .babelrc di direktori kerja, saya menduga salah satu dari mereka mengganggu transpilasi.

Ketika saya memindahkan folder migrasi dan knexfile.ts di direktori yang bersih, itu berfungsi lagi .

Halo kawan-kawan. Jadi seperti yang dikatakan @mikl , masalahnya adalah, Anda mencoba menjalankan kode TypeScript pada penerjemah simpul. Saya mengalami masalah ini hari ini ketika saya mencoba membuat migrasi baru.

Saya telah memecahkan masalah ini dengan menjalankan knex melalui ts-node (https://npmjs.com/package/ts-node).

Untuk membuatnya berfungsi, tambahkan saja skrip ini di dalam file package.json :)

"migrate:make": "ts-node ./node_modules/.bin/knex migrate:make --knexfile <PATH_TO_YOUR_KNEXFILE>"

Replikasi ini ke migrate:latest , seed:run dll... :)
Kemudian jalankan saja skrip baru Anda!

Larutan

Alih-alih --knexfile gunakan --cwd

-    "migrate-make": "knex migrate:make --knexfile ./src/db/knexfile.ts",
+    "migrate-make": "knex migrate:make --cwd src/db",

Larutan

Alih-alih --knexfile gunakan --cwd

-    "migrate-make": "knex migrate:make --knexfile ./src/db/knexfile.ts",
+    "migrate-make": "knex migrate:make --cwd src/db",

Terima kasih !! Ini sangat membantu saya.

Mengapa ini ditutup? Benar-benar rusak ketika bekerja dengan knexfile.ts, mencoba semua yang saya bisa dari utas ini ... (versi terbaru + TypeScript 3.6.4)

Mengapa ini ditutup? Benar-benar rusak ketika bekerja dengan knexfile.ts, mencoba semua yang saya bisa dari utas ini ... (versi terbaru + TypeScript 3.6.4)

Buka edisi baru dan berikan kode reproduksi (misalnya tautan ke proyek contoh tempat masalah Anda terjadi). Ini ditutup karena @brunolm menemukan solusi untuk masalahnya.

Itu masih rusak dengan --cwd :

knexfile.ts:6
export default {
^^^^^^

SyntaxError: Unexpected token export

Jadi, saya tidak akan mengangkat masalah baru karena saya tidak tahu bagaimana cara kerjanya. Contoh TypeScript lengkap minimal di dokumen adalah ... anugerah
Contoh TypeScript Objectin.js tidak repot-repot menggunakan knex dalam TypeScript, jadi saya pikir mereka memiliki masalah yang sama ...

Nah ... Apa yang ingin saya miliki:

  • semua kode sumber saya di ts
  • knexfile.ts di TypeScript
  • migrasi dalam TypeScript (untuk membuat api autocomplete createTable saat coding)
  • kemampuan untuk membuat semua ini berfungsi di CLI (migrasi knex) DAN menggunakan api di dalam app.ts saya (migrasi otomatis saat startup server)

Saya pikir poin terakhir ini lebih menyakitkan ...

Apa yang harus saya lakukan untuk membuat semuanya bekerja:

  • di tsconfig set allowJs=true + declaration=false (tanpa ini knex akan mencoba mengeksekusi file .d.ts ...)
  • knexfile.ts : sepertinya wajib menggunakan export = alih-alih ekspor TypeScripts ... Jadi ya, saya memiliki file ts tetapi di app.ts saya, saya tidak dapat mengimpornya dan harus memerlukannya ..
  • app.ts : hanya memuat file yang dikompilasi .js berfungsi : knex.migrate.latest({ loadExtensions: ['.js'], });
  • package.json : juga, hanya file yang dikompilasi js yang berfungsi (di dalam /dist saya): "db:migrate": "knex migrate:latest --cwd ./dist/config --env development --knexfile knexfile.js"

Dan saya lupa beberapa, saya yakin itu ..

Sekarang saya tidak cukup puas karena rasanya benar-benar hacky

@ctiaffay-conserto Anda dapat mencoba contoh ini (ganti knexfile dengan cwd )
https://github.com/brunolm/knex16bug/tree/knex16

Larutan

Alih-alih --knexfile gunakan --cwd

-    "migrate-make": "knex migrate:make --knexfile ./src/db/knexfile.ts",
+    "migrate-make": "knex migrate:make --cwd src/db",

Ini bekerja tapi ... mengapa? Itu tidak terlihat sebagai solusi yang tepat karena --knexfile seharusnya berfungsi.

@ShGKme ini adalah perubahan yang diperlukan untuk membuatnya berfungsi: https://github.com/knex/knex/pull/3005

Tetapi tidak ada yang mau membahasnya, karena cwd berfungsi, saya cukup senang untuk menerimanya.

Saya menghabiskan sore hari untuk melihat ini karena saya menghadapi masalah inisialisasi yang terkait erat. Saya percaya bahwa penilaian @brunolm benar: metode Liftoff#launch(..) dipanggil dengan parameter yang salah. Anda dapat melihat detailnya di #3005

Secara kasar, Liftoff tampaknya berperilaku sebagai berikut:

// If the configPath was specified, then use it.  Otherwise, try to infer it.
const configPath = opts.configPath || inferConfigPath(opts);

function inferConfigPath(opts) {
  // configName represents the expected name of the config file, minus its extension.
  // For example:  "knexfile"
  // If no configName was specified, then attempt to infer it from the name instead.
  // In our case, since `name === "knex"`, this will result in `configName = "knexfile"`
  const configName = opts.configName || (opts.name + "file");

  return findPathFor(configName, {
    withPossibleExtensions: [".js", ".ts"],
    inDirectory: opts.cwd,
  });
}

Karena saat ini ada bug dalam cara Liftoff#launch(..) dipanggil, nilai configPath _always_ sedang disimpulkan. Akibatnya, Liftoff tidak akan memulai skrip preload . (Khususnya: ts-node/register akan gagal dimuat)

@briandamaged Bisakah Anda memberikan perbaikan yang tidak akan merusak tes yang ada?

@kibertoad + @brunolm : Saya akan mencoba mengumpulkan sesuatu baik nanti hari ini atau besok. Saya masih memastikan saya memahami gambaran besarnya terlebih dahulu. Dari apa yang saya tahu, sepertinya Knex CLI mungkin menduplikasi beberapa fungsi yang sudah disediakan oleh perpustakaan Liftoff .

@briandamaged Bisa jadi. Selama tes cli lulus sehingga kami tahu bahwa kami tidak memperkenalkan perubahan yang melanggar bagi pengguna, silakan refactor sedalam yang diperlukan.

@brunolm @ShGKme @mmiszy @ilkka Ini akan bekerja lebih baik di 0.20.9 berkat karya luar biasa dari @briandamaged. Silakan mencobanya dan beri tahu saya jika perubahan itu bermanfaat bagi Anda.

@kibertoad Semua berfungsi, terima kasih banyak 👍

@kibertoad terima kasih banyak! Saya dapat mengonfirmasi bahwa itu berfungsi 100% sekarang!

api_1    | > knex migrate:make --knexfile ./src/db/knexfile.ts "test"
api_1    |
api_1    | Requiring external module ts-node/register
api_1    | Working directory changed to /usr/src/app/src/db
api_1    | Created Migration: /usr/src/db/migrations/20200210194631_test.ts

@brunolm Haha, @briandamaged adalah pahlawan sejati. Senang itu berfungsi dengan baik sekarang!

Saya masih mendapatkan kesalahan ini dengan NodeJS 14.0.0, perintah knex migrate:make test , dan file berikut:

// knexfile.ts

export const config = {

  development: {
    client: "postgres",
    connection: {
      filename: "./dev.sqlite3"
    }
  },

  staging: {
    client: "postgresql",
    connection: {
      database: "my_db",
      user: "username",
      password: "password"
    },
    pool: {
      min: 2,
      max: 10
    },
    migrations: {
      tableName: "knex_migrations"
    }
  },

  production: {
    client: "postgresql",
    connection: {
      database: "my_db",
      user: "username",
      password: "password"
    },
    pool: {
      min: 2,
      max: 10
    },
    migrations: {
      tableName: "knex_migrations"
    }
  }
};

Saya mendapatkan kesalahan ini:

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 @babel/register
(node:6468) UnhandledPromiseRejectionWarning: C:\Users\Flori\WebstormProjects\OragesAuthentication-Backend\knexfile.ts:3
export const config = {
^^^^^^

SyntaxError: Unexpected token 'export'
    at wrapSafe (internal/modules/cjs/loader.js:1101:16)
    at Module._compile (internal/modules/cjs/loader.js:1149:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1205:10)
    at Module.load (internal/modules/cjs/loader.js:1034:32)
    at Function.Module._load (internal/modules/cjs/loader.js:923:14)
    at Module.require (internal/modules/cjs/loader.js:1074:19)
    at require (internal/modules/cjs/helpers.js:72:18)
    at openKnexfile (C:\Users\Flori\WebstormProjects\OragesAuthentication-Backend\node_modules\knex\bin\cli.js:26:16)

EDIT: Ini diperbaiki dengan menambahkan ts-node sebagai ketergantungan. Maaf untuk ketidaknyamanannya.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

zettam picture zettam  ·  3Komentar

rarkins picture rarkins  ·  3Komentar

sandrocsimas picture sandrocsimas  ·  3Komentar

mishitpatel picture mishitpatel  ·  3Komentar

npow picture npow  ·  3Komentar