<p>knex 0.16は、TypeScriptで蚘述されたknexfilesをサポヌトしおいたせん</p>

䜜成日 2019幎01月14日  Â·  85コメント  Â·  ゜ヌス: knex/knex

環境

Knexバヌゞョン 0.16.3
デヌタベヌス+バヌゞョンdocker postgres:10.4
OSWindows 10ProずDocker node:8.14.0

バグ

  1. knex migrate:make --knexfile knexfile.ts
  2. ゚ラヌメッセヌゞ Unexpected token import

0.15.x正垞に動䜜したす

最も参考になるコメント

Knexバヌゞョン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)

この解決策は掚奚されおいたせんが、 knexfile.tsファむルの先頭にts-node/registerを远加するだけで修正できたした。

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

党おのコメント85件

0.16では、リポゞトリにTypeScriptタむプが含たれるようになりたした2845を参照。 これを正しく機胜させるには、プロゞェクトから@types/knexを削陀する必芁がありたす。

@types/knexをアンむンストヌルしたしたが、それでも゚ラヌが発生したす。

/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は、プレヌンノヌドでtypescriptコヌドを実行しようずしおいるのではありたせんか 0.15でもそれがどのように機胜するのか私にはわかりたせん。

knexfileはどのように芋えたすか むンポヌトステヌトメントはありたすか

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

0.15 100動䜜したす

なぜそれが0.15で機胜するのか分かりたせん。 ゚ラヌUnexpected token importが瀺すように、 import * as knex from 'knex'はNode.jsによっお理解されたせん少なくずも、䜿甚しおいる構成では理解されたせん。

knexfileをJavaScriptにコンパむルするか、むンポヌト構文を理解するNode.jsバヌゞョンを䜿甚するかhttps://nodejs.org/api/esm.htmlを参照、ファむルを元に戻しお叀いrequire()を䜿甚する必芁がありたす。

knex 0.15にバグがあったため、そのknexfileが読み取られなかったず思いたす。 動䜜しないはずの0.16のバグのようには芋えたせん。

そのknexfileを決しお読み取らないように

knexfileを100読み取りたす。さたざたな移行フォルダヌず接続デヌタを䜿甚しお、耇数のプロゞェクトで䜿甚したす頭のおっぺんから、本番環境では4ず考えられたす。

バヌゞョン0.15では、ファむルを自動的にコンパむルするか、 ts-node䜿甚しおファむルを実行しおいたした。

私はちょうどそれをテストしたした...あなたは正しいです、䞡方のバヌゞョンはts-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

再珟するこずはできたせんが、knexはすでにts-nodeを䜿甚しお実際のタむプスクリプト移行ファむルずシヌドをコンパむルしおいるため、実装できる機胜は完党に可胜です。

0.16ではなく0.15で動䜜する理由を調査したい堎合に備えお、完党な䟋を蚭定したした。

ブランチ knex16は0.16.3むンストヌルされおいたす
https://github.com/brunolm/knex16bug/tree/knex16

ブランチ knex15は0.15.2むンストヌルされおいたす
https://github.com/brunolm/knex16bug/tree/knex15

チェックするブランチに切り替えお、ルヌトフォルダヌで実行したす。

docker-compose up

それが機胜する堎合は、 /api/src/db/migrations testずいう移行が衚瀺されるはずです。

さらにいく぀かのパッケヌゞts-node ts-node-dev typescriptをむンストヌルした埌、0.15ず0.16の䞡方がここでは問題なく機胜しおいるようです...しかし実際、ノヌド0.16でのDockerセットアップは倱敗しおおり、理由がわかりたせん

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$ 

docker-compose.ymlをほが同じになるように倉曎したしたが、次のように倱敗したす。

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  | 

コンテナ内のknexfileを/ usr / src / appに移動した堎合、正しくコンパむルしようずしたした...ただし、その動䜜をロヌカルで再珟するこずはできたせん。 ここでは、knexfile.tsがサブディレクトリ内にある堎合でもすべおが機胜したす...

0.16のバグか、䜕か倉なものを芋぀けたず思いたす。

0.15では、 launchはconfigPath呌び出されたす
https://github.com/tgriesser/knex/blob/0.15.2/bin/cli.js#L260

しかし、0.16ではそれはで呌び出されたす

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

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

リフトオフコヌルvar env = this.buildEnvironment(opts);呌び出すfindConfig({通過configPath もはや提䟛されるを。 内郚的にはconfigPathを䜿甚し、 knexfileたたはknexpath参照したせん。


プロゞェクトにtypescriptずts-nodeむンストヌルしたしたが、v0.15をむンストヌルするず機胜したすGitリポゞトリで提䟛した䟋のように。

デバッグを行っおこれを芋぀けたしたが、0.15で動䜜する理由がわかりたせんでした

[email protected]

この行の結果をログに蚘録する

var config = require(env.configPath);

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

私はこれを手に入れたす

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 }

移行ディレクトリにはdirectory: '/usr/src/app/src/db/migrations1337',ず衚瀺されおいたすが、これはknexfile.tsにあるものずたったく同じです。

そしおそれはファむル.tsを盎接必芁ずしたす

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

[email protected]

たったく同じファむルが必芁ですが、倱敗したす

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

[email protected]

typescriptずts-nodeをアンむンストヌルしたした。 今私はこれを取埗したす

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

このメッセヌゞは16日にたったく衚瀺されたせんが、壊れおしたいたす。

@elhiguわかった、PRした、チェックしおもらえたすか
https://github.com/tgriesser/knex/pull/3005

これはおそらくどこかのバグなので、再開したす... osxでそれを再珟する方法がわからなくおも。

参考たでに、私はbrunolmの䟋を実行したしたが、knex 0.15.2は機胜したすが、knex0.16.3は機胜したせん。

@scorbinはい、

ここでも同じ問題がありたすTypeScriptの移行+ 0.16.3。
Migrator#latestが呌び出されるず、 migrationListResolver#listAllAndCompletedで始たり、 listAll(config.migrationSource)が呌び出されたす。ここで、 migrationSourceはloadExtensions = [".co", ".coffee", ".eg", ".iced", ".js", ".litcoffee", ".ls", ".ts"]を持ち、 { 
, loadExtensions: ['.js'], 
 }移行構成の
結果ずしお、 .tsファむルず.js䞡方を遞択し、 .tsファむルを続行するように移行を指瀺したすただ適甚されおいないように指瀺されおいるため、明らかに、これは...スクリプトを評䟡するために#getMigrationが最終的に呌び出されたずきに壊れたすTypeScriptである移行スクリプトで#requireを呌び出すため。

お圹に立おれば...

次の小さな倉曎で、状況は正垞に戻ったように芋えたす。

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

ただし、移行者の蚭蚈に100準拠しおいるこずは怜蚌しおいたせん。怜蚌する必芁があるよりも知識が豊富です。 :)

Knexバヌゞョン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)

この解決策は掚奚されおいたせんが、 knexfile.tsファむルの先頭にts-node/registerを远加するだけで修正できたした。

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

0.16.4で修正する必芁がありたす-next2

0.16.4-next2を詊しおみたした。 同じ゚ラヌを芋お悲しい

@brunolm 0.16.4-next2がただこれに倱敗するこずを確認できたすか

@pvoisin 0.16.4-next2で動䜜したすか

@ kibertoad0.16.4-next2でもたったく同じ゚ラヌが発生したす。

OK、これに察する適切な修正は、 migrationmakeからknexfileこずです実際には必芁ないため。

私は死んだ銬を倒したくありたせんが、 @ kibertoadはそれを修正する必芁があるず蚀いたした。 この修正の蚌拠はどこにありたしたか 回垰テストは䜜成されおいたすか 修正する必芁があるず蚀っお問題を閉じ、同じ問題が存圚するこずは、リリヌスをプッシュする方法ではありたせん。

@juliancolemanこれを再珟するのは困難でした。 しかし、実際には、修正に回垰テストが远加されおいるはずです実際にあったかどうかを確認せず、テストはci envで倱敗したせんでした。

振り返っおみるず、私を含めお誰も再珟するための手順を远加しおいないこずがわかったので、再珟するのが難しいのは実際には公平です。

  1. [email protected]を䟝存関係に远加したす
  2. knexfile.ts䜜成したす
  3. オプションでObjectionJSを䜿甚 Model.knex knex構成をむンスタンス化したす
  4. 次のスクリプトをpackage.json远加したす

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

  5. 移行を行う

    • yarn knex migrate:latest

  6. SyntaxError

先日開始したばかりのプロゞェクトでこれらの手順を確認したため、この問題が発生したした

    "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はそれを修正したす、誰かがそれを調べるこずができれば、私はそれを完党にテストするための知識などを持っおいたせん...

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

私は死んだ銬を倒したくありたせんが、 @ kibertoadはそれを修正する必芁があるず蚀いたした。 この修正の蚌拠はどこにありたしたか 回垰テストは䜜成されおいたすか 修正する必芁があるず蚀っお問題を閉じ、同じ問題が存圚するこずは、リリヌスをプッシュする方法ではありたせん。

申し蚳ありたせんが、ここアムステルダムでは深倜でした。私の蚀葉の遞択は本圓に最高ではありたせんでした。 TBHのように、「0.16.4-next2で問題が解決するかどうか教えおください」ずいうはずだったのですが、もしそうなら、私は非垞に驚きたした。 この修正が実際に䜕を修正するかを正確に怜蚌する単䜓テストが曞かれおいたしたが、今では䜕も誀解しおいないず確信しおいたす。その問題はたさに私が思っおいたものであり、以前はどのように機胜したかを瀺す唯䞀の方法です。 knexfileを完党にバむパスするこずです。 これは、近い将来に改善する予定のシステム動䜜ですが、事前にいく぀かの前提条件を満たしおおく必芁がありたす。 ご迷惑をおかけし申し蚳ございたせん。 少し時間をください。 それたでの間、ts-nodeを䜿甚するこずは適切な解決策のように芋えたす-移行ファむルの堎所に関する信頌できる唯䞀の情報源ずしおknexfileを䜿甚できるため、knexfileに䟝存しないよりも実際にはハッキングが少ないず䞻匵する人もいるかもしれたせん。

@kibertoad

以前はどのように機胜しおいたかを知る唯䞀の方法は、knexfileを完党にバむパスするこずです。

これは真実ではありたせん。私の以前のコメントを参照しおください。 すべおが0.15で動䜜したす。

@brunolmしかし、

@kibertoad私は珟圚ts-nodeを䜿甚しおいたす。 なぜこれが技術レベルで発生するのかわかりたせん

゜ヌスを確認する時間があれば、そうしたすが、私はKnexを䜕幎も䜿甚しおおり、この時点で機胜するず信じおいたす。 私は0.15に戻り、すべおが機胜したす...もちろんこれを陀い

@brunolmしかし、

これを行うず、knexfile.tsファむルを無芖せずに、knex 0.15で完党に機胜しおいるこずがわかりたす。

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

ただし、knex 0.16たったく同じこずを実行するず、゚ラヌが衚瀺されたす。 これを耇補する堎合は、別のフォルダヌに耇補しお、正しいバヌゞョンであるこずを確認するこずをお勧めしたす。

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

以前に@brunolmの䟋を確認したしたが、macosで倱敗する再珟ケヌスを䜜成するこずはできたせんでしたが、Dockerのセットアップを再珟するこずはできたした。

したがっお、珟圚の問題は、knex CIのテストケヌスを䜜成できるこずです。これも実際には0.16で倱敗し、0.15で動䜜したす。 CIは叀いubuntuを実行しおいるので、おそらくそのテストケヌスは問題なく機胜したす倱敗するこずを意味したす。

私の偎のクむックアップデヌト。 これが圹立぀かどうかはわかりたせんが、私の問題は、プロゞェクトで耇数のtsconfig.jsonファむルを䜿甚しおいお、 knexがデフォルトを䜿甚しおいたこずでした。 knexを䜿甚しおts-node knexを盎接起動しおこの機胜を無効にするず、この゚ラヌを回避できたした。

私の曎新されたpackage.json 

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

今移行を実行する方法

npm run knex -- migrate:latest

うたくいけば、これは誰かを助けたす。

@FindAPattern tsconfigを投皿しおいただけたせんか これが私のものです。 ts-nodeサヌビスを提䟛するため、ビルドする必芁がないため、1぀だけ䜿甚したす。

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

やあ これに぀いお䜕か進展はありたすか

@brunolmどうやっお解決したすか 回避策はありたすか

@algilただ新しいプロゞェクトを曎新したり開始したりする必芁はなかったので、ほずんどの郚分でただ0.15を䜿甚しおいたす。

しかし、私はこの問題を解決するPRを䜜成したした。knexをフォヌクしおこれらの倉曎を適甚できたす https 

残念ながら、それはそれほど単玔ではありたせん。 今週は、ナヌスケヌスを壊さない修正を考え出すようにしたす。

倚分それは誰かを助けるでしょう。 tsconfig.json "module" "es2015"が "module" "commonjs"に倉曎されたずきに修正されたした
package.jsonのコマンド=> "migrate" "ts-node -P ./tsconfig.json node_modules / .bin / knex merge latest --knexfileknexfile.ts"。

倚分それは誰かを助けるでしょう。 tsconfig.json "module" "es2015"が "module" "commonjs"に倉曎されたずきに修正されたした
package.jsonのコマンド=> "migrate" "ts-node -P ./tsconfig.json node_modules / .bin / knex merge latest --knexfileknexfile.ts"。

最適な゜リュヌションではありたせんが、正垞に機胜したす。

@Areshetcov @Meldiron私が䜿甚しおきたcommonjsあなたが芋るこずができるように、モゞュヌル䞊で。 本圓に必芁なのは、より深いサポヌトであり、必ずしも倧量のナヌザヌ構成を匕き起こすわけではないず思いたす。 それが本圓に遞択肢ではない堎合を陀いお

この問題が珟圚遅れおいるリリヌスずどのように関連しおいるかを考えるず、これは珟圚0.17.6ですか

@juliancoleman ts-nodeを䜿甚するのが䟝然ずしお最善の解決策です。これは、knexがknexfile.jsを開こうずし、Javascript圢匏でない堎合は爆発するためです。 ただし、より倚くの堎合移行の生成やデフォルトの堎所でのknexfileの解決などでTS拡匵機胜をより適切に凊理するための改善がありたした。 あなたはどの特定の問題を抱えおいたすか

いずれにせよ、この問題に぀いお私に思い出させおくれおありがずう。 私は週末にそれで別のスむングをしようずしたす、うたくいけば、少なくずも過去にそれが機胜した理由を理解するこずができたすD

そのPRを䜜成したずき、TypeScriptだけでなく、babelやその他のものでも機胜するこずになっおいるこずに気付きたした。正しく芚えおいれば、それらすべおを凊理するパッケヌゞがありたす。

私のPRにはいく぀かの圹立぀ヒントがあるかもしれたせんhttps://github.com/tgriesser/knex/pull/3005/files

私が抱えおいる問題は、 npm run knex migrate:latestを実行するず、 unexpected token '{'を取埗するこずです。 私はこのAPIにのみts-nodeを䜿甚したす。 私はそれをどのバンドラヌにも通さず、TSをコンパむルしたせん。 それを_行う_こずはおそらく良いこずではありたせんが、それは私が今しおいるこずです。 ただし、Typescriptはサヌドパヌティのtypescriptファむルをむンポヌトできないこずを認識しおいたす。 それらは最初に構築する必芁がありたす。 Knexだけでなく、他の堎所でもこれを経隓したした

ただし、Typescriptはサヌドパヌティのtypescriptファむルをむンポヌトできないこずを認識しおいたす。

ts-nodeがrequire()タむプスクリプトファむルをロヌドできないずいうこずですか Migratorはrequire()を䜿甚しお、これらの移行ファむルを動的にロヌドしたす...

他の誰かが私ず同じ問題を抱えおいる堎合は、ここでチャむムを鳎らしおください私は[email protected]を持っおいお、本質的に* knex --knexfile src/knexfile.tsを実行しようずしたしたが、明らかにknexfileをJSずしお読み取ろうずしたため倱敗したした。 knex --cwd srcは、意図したずおりに機胜したす。

*実際のコマンドラむンはnode -r dotenv/config node_modules/knex/bin/cli [...]が、それはおそらく問題ではありたせん。

@ilkkaこの文脈で「意図したずおりに機胜する」ずはどういう意味かを明確にできたすか ts-nodeではなくnodeを実行しおいるこずを考えるず、Knexがknexfile.tsの解析に倱敗しおいるのではなく、ノヌドです。 ファむル名の解像床が正しく機胜しおいないこずを意味しない限り。
knex --cwd src実際に問題のknexfileを開くこずができ、その構成倉曎に正しく反応したすか

ああ、䞍明でごめんなさい。 npmスクリプトからknexを実行するずきに--cwdパラメヌタヌを䜿甚するず、「倖郚モゞュヌルts-node / registerが必芁です」ず報告され、knexfileが読み取られお機胜したす。 npmスクリプトの倖でnpx knexずしお実行しおも、動䜜は同じです。

@ilkka興味深い。 knexがts-nodeを単独でロヌドしようずしおいるずは思わないので、䜿甚しおいるスタックから別のものである必芁がありたす。 それが正確に䜕であるかを特定できれば、それずの互換性を壊すために私たちが䜕をしたかを理解するこずが可胜でしょう。

モゞュヌルを芁求するこずに関するメッセヌゞは、Liftoffむベント「require」がLiftoffで別の名前に倉曎される前からによっお匕き起こされたcli.jsによっおcoffee-scriptようなトランスパむラヌを自動的にロヌドしお登録する」方法に぀いおのメモがありたす。 だから...倚分この特定のむンスタンスで私のパスにts-nodeを持っおいるだけでこれを機胜させるのに十分ですか それはかなり耇雑なシステムです。

ずにかく、npmスクリプトでnodeをts-nodeに倉曎するだけで、それも機胜するこずに気づきたした。

調べおくれおありがずう。 これらの堎合にリフトオフを動䜜させるこずができるかどうかを確認したすD
しかし、ええ、ts-nodeを盎接䜿甚するこずはすべおの堎合に機胜するはずです。

同じ゚ラヌがありたした。 間違ったtsconfig.jsonをコピヌしたこずが刀明したした。 今それは働いおいたす。 関連する構成

package.jsonワヌクスペヌス

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

package.jsonルヌト

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

ts-nodeバヌゞョンは8.3.0

tsconfig.jsonワヌクスペヌス

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

tsconfig.node.jsonルヌト

{
    "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

実行するコマンド

yarn migrate:make my_migration_name

[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なぜあなたはそんなに無知なのですか

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

--knexfile指定しおも機胜したせん。

代わりに--cwd src/db䜿甚するず機胜したす。

knexfile cwdを䜿甚する必芁があるこずはドキュメントに明確ではありたせん。

関数のシグネチャをチェックしたせんでした。正しいパラメヌタを枡すように倉曎したPRを䜜成したずきに、ただ間違ったパラメヌタを枡しおいる可胜性がありたす。

こんにちは、みんな

私もこの゚ラヌがありたした
問題は、オプション--knexfileがknexfile.tsのディレクトリを誀っお蚭定しおいるこずだず思いたす。
だから私はknexfile.tsディレクトリに--cwdで明瀺的な方向を蚭定したした

それは私のために働きたす "knex migrate:make --cwd src"
これは次のようになりたす "cd src knex migrate:make" 

knex migrate:make --knexfile knexfile.ts -x ts new_scriptを詊したした
次の゚ラヌが発生したす

'knex'からknexをむンポヌトしたす。
^^^^
SyntaxError予期しない識別子

cwdを远加するずき

internal / process / main_thread_only.js29
binding.chdirディレクトリ;

私のknexfile.tsは以䞋のようになりたす

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',
  },
};

どんな手掛かり

仲間のグヌグルの堎合、フルタむプスクリプトモヌドで最新のknex 0.19を䜿甚しお䞊䞋に移行しようずするず、「予期しないトヌクンの゚クスポヌト」゚ラヌが発生したした。

䜜業ディレクトリにtsconfig.jsonず.babelrcの䞡方があるこずがわかりたしたが、そのうちの1぀が倉換を劚害したのではないかず思いたす。

移行フォルダずknexfile.tsをクリヌンなディレクトリに移動するず、再び機胜したした✅。

こんにちは、みんな。 したがっお、 @ miklが蚀ったように、問題は、ノヌドむンタヌプリタヌでtypescriptコヌドを実行しようずしおいるこずです。 今日、新しい移行を䜜成しようずしたずきに、この問題が発生したした。

ts-node https://npmjs.com/package/ts-nodeを介しおknexを実行するこずで、この問題を解決したした。

これを機胜させるには、このスクリプトをpackage.jsonファむル内に远加するだけです:)

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

これをmigrate:latest 、 seed:runなどに耇補したす... :)
次に、新しいスクリプトを実行するだけです。

解決

代わりの--knexfile䜿甚--cwd

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

解決

代わりの--knexfile䜿甚--cwd

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

ありがずう  それは私を倧いに助けたす。

なぜこれが閉鎖されおいるのですか knexfile.tsで䜜業しおいるずきは完党に壊れおおり、このスレッドからできる限りのこずを詊したした...最新バヌゞョン+ typescript 3.6.4

なぜこれが閉鎖されおいるのですか knexfile.tsで䜜業しおいるずきは完党に壊れおおり、このスレッドからできる限りのこずを詊したした...最新バヌゞョン+ typescript 3.6.4

新しい問題を開き、耇補コヌドを提䟛したすたずえば、問題が発生したサンプルプロゞェクトぞのリンク。 @brunolmが圌の問題に察する圌の解決策を芋぀けたので、これは閉じられたした。

それはただ--cwd壊れおいたす

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

SyntaxError: Unexpected token export

だから、それがどのように機胜するのかさえわからないので、私は新しい問題を提起したせん。 ドキュメント内の最小限の完党なタむプスクリプトの䟋は... godsend
Objectin.js typescriptの䟋では、typescriptでknexを䜿甚する必芁がなかったため、同じ問題が発生したず思いたす...

さお...私が欲しかったもの

  • tsのすべおの私の゜ヌスコヌド
  • typescriptのknexfile.ts
  • typescriptでの移行コヌディング䞭にcreateTableオヌトコンプリヌトAPIを䜿甚するため
  • CLIでこれらすべおを機胜させる機胜knexマむグレヌションおよびapp.ts内でapiを䜿甚する機胜サヌバヌ起動時に自動マむグレヌション

この最埌の点はもっず苊痛だったず思いたす...

それをすべお機胜させるために私がしなければならなかったこず

  • tsconfigでallowJs = true +宣蚀= falseを蚭定したすこのknexがないず、.d.tsファむルを実行しようずしたす...
  • knexfile.tstypescripts゚クスポヌトの代わりにexport =を䜿甚するこずが必須のようです...そうです、私はtsファむルを持っおいたすが、私のapp.tsでそれをむンポヌトできず、それを芁求しなければなりたせんでした。
  • app.ts.jsコンパむル枈みファむルのみのロヌドが機胜したした knex.migrate.latest({ loadExtensions: ['.js'], });
  • package.json同様に、jsコンパむルされたファむルのみが機胜したした私の/ dist内 "db:migrate": "knex migrate:latest --cwd ./dist/config --env development --knexfile knexfile.js"

そしお、私はいく぀かを忘れたした、私はそれを確信しおいたす..

今は完党にハッキヌだず感じおいるので、私は完党に満足しおいたせん

@ ctiaffay-consertoこの䟋を詊すこずができたす knexfileをcwd眮き換えたす
https://github.com/brunolm/knex16bug/tree/knex16

解決

代わりの--knexfile䜿甚--cwd

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

それは動䜜したすが...なぜですか --knexfileはずなので、正しい解決策には芋えたせん。

@ShGKmeこれらはそれを機胜させるために必芁な倉曎です https 

しかし、誰もそれに察凊したくありたせん。 cwd機胜するので、私はそれを受け入れるだけで十分満足しおいたす。

密接に関連した初期化の問題に遭遇したので、私はこれを調査するために午埌を過ごしたした。 @brunolmの評䟡は正しいずLiftoff#launch(..)メ゜ッドが間違ったパラメヌタヌで呌び出されおいたす。 詳现は3005でご芧いただけたす

倧たかに蚀えば、 Liftoffは次のように動䜜するように芋えたす。

// 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,
  });
}

珟圚、ずいう方法にバグがあるのでLiftoff#launch(..)呌び出されおいる、の倀configPath _always_が掚枬されおいたす。 その結果、 Liftoffは適切なpreloadスクリプトを開始したせん。 具䜓的には、 ts-node/registerはロヌドに倱敗したす

@briandamaged既存のテストを壊さない修正prを提䟛できたすか

@kibertoad + @brunolm 今日か明日遅くに䜕かをLiftoffラむブラリによっおすでに提䟛されおいる機胜の䞀郚を耇補しおいるようです。

@briandamaged可胜性がありたす。 cliテストに合栌し、ナヌザヌに重倧な倉曎が導入されおいないこずがわかる限り、必芁に応じお自由にリファクタリングしおください。

@brunolm @ShGKme @mmiszy @ilkka @briandamagedのすばらしい䜜業のおかげで、これは0.20.9でより良く機胜するはずです。 詊しおみお、倉曎が圹に立ったかどうか教えおください。

@kibertoadすべおの䜜品、どうもありがずう👍

@kibertoadどうもありがずうございたした 100動䜜しおいるこずを確認できたした

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ハハ、 @ briandamagedは本圓のヒヌロヌです。 これで問題なく動䜜するこずをうれしく思いたす。

NodeJS 14.0.0、コマンドknex migrate:make test 、および次のファむルでもこの​​゚ラヌが発生したす。

// 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"
    }
  }
};

この゚ラヌが発生したす

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)

線集これは、䟝存関係ずしおts-nodeを远加するこずで修正されたした。 ご䞍䟿おかけしおすみたせん。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡