<p>لا يدعم knex 0.16 ملفات knex المكتوبة في TypeScript</p>

تم إنشاؤها على ١٤ يناير ٢٠١٩  ·  85تعليقات  ·  مصدر: knex/knex

بيئة

إصدار Knex: 0.16.3
إصدار + قاعدة البيانات: docker postgres:10.4
نظام التشغيل: Windows 10 Pro & 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)

لا يتم تشجيع هذا الحل ولكني قمت بإصلاحه ببساطة عن طريق إضافة ts-node/register في بداية ملف knexfile.ts .

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 تشغيل كود مكتوب مع عقدة عادية؟ ليس لدي أي فكرة عن كيفية عمل ذلك مع 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

يعمل بنسبة 100٪ على 0.15

ليس لدي أي فكرة عن سبب نجاح ذلك مع 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.15 وليس 0.16

الفرع: 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

إذا كان يعمل ، يجب أن ترى ترحيلاً يسمى test في /api/src/db/migrations

بعد تثبيت بعض الحزم الأخرى (ts-node ts-node-dev typecript) ، يبدو أن كلا من 0.15 و 0.16 يعملان بشكل جيد هنا ... ولكن بالفعل فشل إعداد عامل الإرساء الخاص بك مع العقدة 0.16 وليس لدي أي فكرة عن السبب

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

تستدعي LiftOff 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 لقد علاقات عامة ، هل يمكنك التحقق من ذلك؟
https://github.com/tgriesser/knex/pull/3005

إعادة الفتح نظرًا لأن هذا ربما يكون خطأ في مكان ما ... حتى أنني لا أعرف كيفية إعادة إنتاجه على OSX.

لمعلوماتك ، قمت بتشغيل مثال برونولم ويعمل knex 0.15.2 بينما لا يعمل knex 0.16.3

scorbin نعم ، لقد تمكنت من إعادة إنتاج ذلك أيضًا باستخدام عامل الإرساء ، ولكن ليس محليًا على OSX. هذا هو السبب في أنني أعدت فتح هذا.

نفس المشكلة هنا (تهجيرات 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 أخيرًا لتقييم البرنامج النصي (لأنه يستدعي #require مع برنامج الترحيل النصي وهو TypeScript).

أتمنى أن يساعدك هذا...

مع التغيير البسيط التالي ، يبدو أن الأمور عادت إلى طبيعتها:

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)

لا يتم تشجيع هذا الحل ولكني قمت بإصلاحه ببساطة عن طريق إضافة ts-node/register في بداية ملف knexfile.ts .

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

يجب أن تكون ثابتة في 0.16.4-next2

حاولت للتو 0.16.4-next2. من المحزن أن نرى نفس الخطأ

brunolm هل يمكنك تأكيد أن 0.16.4-next2 لا يزال يفشل هذا؟

pvoisin هل يعمل معك مع 0.16.4-next2؟

kibertoad أتلقى نفس الخطأ بالضبط 0.16.4-next2.

حسنًا ، لذا فإن الحل المناسب لذلك هو إزالة الاعتماد على knexfile بالكامل من الترحيل: make (لأنه لا يحتاج إليه حقًا).

لا أريد التغلب على الحصان الميت ، لكن @ kibertoad قال إنه يجب إصلاحه. أين كان الدليل على هذا الإصلاح؟ هل تمت كتابة اختبارات الانحدار؟ إن القول بأنه يجب إصلاحه ، وإغلاق المشكلة ، ووجود نفس المشكلة ليس هو الطريقة التي يجب دفع الإصدارات بها.

juliancoleman كان من الصعب إعادة إنتاج هذا. غير أنّ هناك حقّا كان ينبغي كان يتلقّى يكون تراجع إختبار يضاف في الإصلاح (لم يفحص إن هناك كان في الحقيقة ويختبر فقط لم يفشل على CI ENV).

من الصعب التكاثر في الواقع لأنني نظرت إلى الوراء ورأيت أنه لم يضف أحد ، بما في ذلك أنا ، خطوات للتكاثر.

  1. أضف [email protected] إلى التبعيات
  2. أنشئ knexfile.ts
  3. (اختياريًا باستخدام ObjectJS) إنشاء نموذج knex على Model.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

العلاقات العامة الخاصة بي تعمل على إصلاحها ، ليس لدي المعرفة لاختبارها بالكامل وما إلى ذلك ، إذا كان بإمكان شخص ما النظر فيها ...

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

لا أريد التغلب على الحصان الميت ، لكن @ kibertoad قال إنه يجب إصلاحه. أين كان الدليل على هذا الإصلاح؟ هل تمت كتابة اختبارات الانحدار؟ إن القول بأنه يجب إصلاحه ، وإغلاق المشكلة ، ووجود نفس المشكلة ليس هو الطريقة التي يجب دفع الإصدارات بها.

أعتذر ، لقد كانت ساعة متأخرة هنا في أمستردام ولم يكن اختياري للكلمات هو الأفضل حقًا. كان يجب أن يكون "الرجاء إخباري إذا كان 0.16.4-next2 يعمل على حل المشكلة" ، لأن TBH ، كنت سأكون متفاجئًا جدًا إذا حدث ذلك. كان هناك اختبار وحدة مكتوب يتحقق بالضبط مما يصلحه هذا الإصلاح فعليًا ، والآن أنا متأكد تمامًا من أنني لا أسيء فهم أي شيء وأن هذه المشكلة هي بالضبط ما اعتقدت أنها هي ، والطريقة الوحيدة التي يمكن أن تعمل بها سابقًا من خلال تجاوز knexfile بالكامل. هذا هو سلوك النظام الذي أعتزم تحسينه في المستقبل القريب ، لكنه يتطلب القليل من المتطلبات الأساسية ليتم تسليمها من قبل. اعتذر عن الازعاج. فقط أعطني بعض الوقت. في غضون ذلك ، يبدو أن استخدام ts-node هو الحل المناسب - قد يجادل المرء بأنه في الواقع أقل اختراقًا من عدم الاعتماد على knexfile ، لأنه يسمح لك باستخدام knexfile كمصدر وحيد للحقيقة فيما يتعلق بموقع ملفات الترحيل.

تضمين التغريدة

والطريقة الوحيدة التي كان يمكن أن يعمل بها سابقًا هي تجاوز knexfile تمامًا.

هذا ليس صحيحا ، انظر تعليقاتي السابقة. كل شيء يعمل على 0.15.

brunolm ولكن هل يمكنك أن تشرح على المستوى التقني كيف قد لا يختنق Node.js أثناء تحليل ملف Typescript حتى افتراضيًا؟ سوف أتحقق من العلاقات العامة ، لكنني أظن أنها تحقق نفس الشيء في النهاية (على الرغم من اختلاف وسائلها) - تتجاوز ملف knexfile.

kibertoad أنا أستخدم عقدة ts حاليًا. لست متأكدًا من سبب حدوث ذلك على المستوى الفني

إذا كان لدي الوقت للتحقق من المصدر ، فسأفعل ذلك ، لكنني كنت أستخدم Knex منذ سنوات وأنا على ثقة من أنه يعمل في هذه المرحلة. عدت إلى 0.15 وكل شيء يعمل ... ما عدا هذا بالطبع

brunolm ولكن هل يمكنك أن تشرح على المستوى التقني كيف قد لا يختنق Node.js أثناء تحليل ملف Typescript حتى افتراضيًا؟ سوف أتحقق من العلاقات العامة ، لكنني أظن أنها تحقق نفس الشيء في النهاية (على الرغم من اختلاف وسائلها) - تتجاوز ملف knexfile.

إذا قمت بذلك ، يمكنك أن ترى أنه يعمل بشكل كامل على knex 0.15 ، ولا يتجاهل ملف knexfile.ts

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 تقوم بتشغيل بعض أوبونتو القديمة ، فربما تعمل حالة الاختبار هذه (بمعنى فشل) هناك على ما يرام.

تحديث سريع في نهايتي. لست متأكدًا مما إذا كان هذا مفيدًا أم لا ، ولكن مشكلتي كانت أنني كنت أستخدم ملفات tsconfig.json في مشروعي ، و knex كان يستخدم الإعداد الافتراضي. عندما تجاوزت هذه الوظيفة من خلال إطلاق knex باستخدام ts-node ، تمكنت من التغلب على هذا الخطأ.

تحديثي 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

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

أهلا! هل هناك أي تقدم في هذا؟

@ برونولم كيف تحلها؟ أي حل؟

algil لم أكن بحاجة إلى تحديث أو بدء مشروع جديد حتى الآن ، لذلك ما زلت أستخدم 0.15 في الغالب.

لكنني قمت بعمل علاقات عامة لحل هذه المشكلة ، يمكنك تفرع knex وتطبيق هذه التغييرات عليها: https://github.com/tgriesser/knex/pull/3005

الأمر ليس بهذه البساطة ، للأسف. سأحاول التوصل إلى حل لا يكسر أي حالات استخدام هذا الأسبوع.

ربما سيساعد شخص ما. تم الإصلاح عند التغيير في "الوحدة" tsconfig.json: "es2015" إلى "الوحدة": "commonjs"
الأمر في package.json => "migrate": "ts-node -P ./tsconfig.json ترحيل node_modules / .bin / knex : latest --knexfile knexfile.ts".

ربما سيساعد شخص ما. تم الإصلاح عند التغيير في "الوحدة" tsconfig.json: "es2015" إلى "الوحدة": "commonjs"
الأمر في package.json => "migrate": "ts-node -P ./tsconfig.json ترحيل node_modules / .bin / knex : latest --knexfile knexfile.ts".

ليس الحل الأمثل ولكنه يعمل بشكل جيد.

AreshetcovMeldiron لقد تم استخدام commonjs حدة كما ترون أعلاه . أعتقد أن ما يجب أن يحدث حقًا هو دعم أعمق ، وليس بالضرورة التسبب في الكثير من تكوين المستخدم. ما لم يكن هذا حقًا ليس خيارًا

بالنظر إلى كيفية ارتباط هذه المشكلة بإصدار متأخر الآن ، فهل هذه مشكلة حاليًا مع 0.17.6 ؟

juliancoleman لا يزال استخدام ts-node هو الحل الأفضل ، حيث لا يزال knex يحاول فتح knexfile.js وينفجر إذا لم يكن بتنسيق Javascript. كان هناك تحسين للتعامل مع امتدادات TS بشكل أكثر رشاقة في المزيد من الحالات (مثل إنشاء الترحيل أو حل ملف knexfile في الموقع الافتراضي) ، مع ذلك. ما هي المشكلة الخاصة التي تواجهها؟

على أي حال ، أشكركم على تذكيري بهذه المشكلة. سأحاول القيام بتأرجح آخر في عطلة نهاية الأسبوع ، آمل أن أفهم على الأقل سبب نجاحها في الماضي: D

عندما صنعت ذلك PR ، لاحظت أنه من المفترض أن يعمل ليس فقط مع TypeScript ، ولكن أيضًا مع babel وبعض الأشياء الأخرى ، هناك حزمة تتعامل مع كل ذلك - إذا كنت أتذكر بشكل صحيح.

قد يكون للعلاقات العامة الخاصة بي بعض التلميحات المفيدة https://github.com/tgriesser/knex/pull/3005/files

المشكلة التي أواجهها هي عندما أقوم بتشغيل npm run knex migrate:latest ، أحصل على unexpected token '{' . أنا أستخدم ts-node فقط لواجهة برمجة التطبيقات هذه. لا أقوم بتشغيله من خلال أي مجمع ولا أقوم بتجميع TS. ربما ليس من الجيد أن أفعل ذلك ، لكن هذا ما أفعله الآن. ومع ذلك ، فإنني أدرك أن Typescript لا يمكنها استيراد ملفات منضدة من جهات خارجية. يجب أن يتم بناؤها أولاً. لقد اختبرت هذا في مكان آخر ، ليس فقط مع Knex

ومع ذلك ، فإنني أدرك أن 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 هل يمكنك توضيح ما تعنيه عبارة "يعمل على النحو المنشود" في هذا السياق؟ بالنظر إلى أنك تقوم بتشغيل node وليس ts-node ، فلن تفشل Knex في تحليل knexfile.ts ، إنها Node. ما لم تقصد أن دقة اسم الملف تعمل بشكل خاطئ.
هل يتمكن knex --cwd src بالفعل من فتح ملف knex المعني ويتفاعل بشكل صحيح مع تغييرات التكوين فيه؟

آه ، أنا آسف لكوني غير واضح. عندما أستخدم المعلمة --cwd عند تشغيل knex من نصوص npm النصية ، فإنها تُبلغ "تتطلب الوحدة الخارجية ts-node / register" ، وتقرأ knexfile الخاص بي ، وتعمل. يكون السلوك هو نفسه إذا قمت بتنفيذه كـ npx knex ، خارج نص برمجي npm.

ilkka ممتع. لا أعتقد أن knex يحاول مطلقًا تحميل ts-node من تلقاء نفسه ، لذلك يجب أن يكون شيئًا آخر من المكدس الذي تستخدمه. إذا تمكنت من تحديد ما هو بالضبط ، فسيكون من الممكن معرفة ما فعلناه لكسر التوافق مع ذلك.

أعتقد أن الرسالة المتعلقة بطلب الوحدة مطبوعة بواسطة cli.js هنا ، بسبب حدث Liftoff (من قبل تمت إعادة تسمية "طلب" إلى شيء آخر في Liftoff). يستخدم Liftoff بدوره حزمة تسمى "rechoir" لتسجيل اللوادر أو أي شيء آخر ، ولدى rechoir's README هذه الملاحظة حول كيفية "تحميل وتسجيل أجهزة التحويل تلقائيًا مثل coffee-script ". إذن ... ربما يكفي مجرد وجود ts-node في مساري في هذه الحالة المحددة لإنجاح هذا الأمر؟ إنه نظام معقد تمامًا.

على أي حال ، أدرك الآن أنه كان بإمكاننا تغيير node إلى ts-node في البرنامج النصي npm الخاص بنا وكان سينجح أيضًا.

أشكرك للنظر فيها. سأرى ما إذا كان بإمكاني جعل الإقلاع يتصرف في هذه الحالات: د
لكن نعم ، يجب أن يعمل استخدام 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 بدلاً من ذلك.

الوثائق غير واضحة أنه يجب عليك استخدام cwd على knexfile .

لم أتحقق من توقيع الوظيفة ، عندما قمت بتغيير العلاقات العامة لتمرير المعلمات الصحيحة ، من المحتمل أنه لا يزال يمرر المعلمات الخاطئة.

اهلا ياجماعة

أنا أيضا كان لدي هذا الخطأ
أعتقد أن المشكلة تكمن في أن الخيار --knexfile تم تعيينه بشكل خاطئ في دليل لـ knexfile.ts
لذلك قمت بتعيين توجيهات صريحة باستخدام --cwd للدليل باستخدام knexfile.ts

إنه يعمل بالنسبة لي: "knex migrate:make --cwd src"
(يساوي هذا: "cd src knex migrate:make" )

حاولت knex migrate:make --knexfile knexfile.ts -x ts new_script
أحصل على متابعة الخطأ

استيراد knex من "knex" ؛
^ ^ ^ ^
صيغة خاطئة: تعريف غير متوقع

عند إضافة cwd

داخلي / عملية / main_thread_only.js: 29
ملزم. 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',
  },
};

أي فكرة؟

بالنسبة لزملائي من مستخدمي Google ، كان لدي خطأ "تصدير رمز مميز غير متوقع" عند محاولة الترحيل لأعلى / لأسفل باستخدام أحدث إصدار من knex 0.19 في وضع الطباعة الكاملة.

تبين أن لديّ كلاً من tsconfig.json و .babelrc في دليل العمل ، وأظن أن أحد هؤلاء قد تداخل مع عملية التحويل.

عندما قمت بنقل مجلد الترحيل و knexfile.ts في دليل نظيف ، عملت مرة أخرى ✅.

اهلا ياجماعة. كما قال mikl ، المشكلة هي أنك تحاول تشغيل كود مكتوب على مترجم العقدة. واجهت هذه المشكلة اليوم عندما كنت أحاول إنشاء هجرة جديدة.

لقد قمت بحل هذه المشكلة عن طريق تشغيل knex من خلال ts-node (https://npmjs.com/package/ts-node).

لإنجاز هذا العمل ، ما عليك سوى إضافة هذا البرنامج النصي داخل ملف 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 ، جربت كل ما استطعت من هذا الموضوع ... (أحدث إصدار + نسخة مطبوعة 3.6.4)

لماذا هذا مغلق؟ لقد تعطل تمامًا عند العمل مع knexfile.ts ، جربت كل ما استطعت من هذا الموضوع ... (أحدث إصدار + نسخة مطبوعة 3.6.4)

افتح إصدارًا جديدًا وقم بتوفير رمز إعادة الإنتاج (على سبيل المثال ، ارتباط إلى مثال مشروع حيث تحدث مشكلتك). تم إغلاق هذا لأن brunolm وجد حله لمشكلته.

لا يزال معطلاً بـ --cwd :

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

SyntaxError: Unexpected token export

لذلك ، لن أثير قضية جديدة لأنني لا أعرف حتى كيف من المفترض أن يعمل. سيكون الحد الأدنى من مثال الكتابة المطبوعة الكاملة في المستندات ... هبة من السماء
المثال المطبوع على Objectin.js لم يكلف نفسه عناء استخدام knex في الكتابة المطبوعة ، لذلك أعتقد أن لديهم نفس المشكلة ...

حسنًا ... ما أردت الحصول عليه:

  • كل ما عندي من شفرة المصدر في ts
  • knexfile.ts في الكتابة المطبوعة
  • عمليات الترحيل في الكتابة المطبوعة (للحصول على واجهة برمجة تطبيقات للإكمال التلقائي للجدول أثناء الترميز)
  • القدرة على جعل كل هذا يعمل في CLI (ترحيل knex) واستخدام واجهة برمجة التطبيقات داخل my app.ts (الترحيل التلقائي عند بدء تشغيل الخادم)

أعتقد أن هذه النقطة الأخيرة كانت كلما زاد الألم ...

ما كان عليّ فعله لإنجاح كل شيء:

  • في مجموعة tsconfig allowJs = true + تصريح = false (بدون هذه الخاصية knex ستحاول تنفيذ ملفات d.ts ...)
  • knexfile.ts: يبدو أنه إلزامي استخدام export = بدلاً من تصدير النصوص المطبوعة ... لذا نعم لدي ملف 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://github.com/knex/knex/pull/3005

لكن لا أحد يريد معالجته ، نظرًا لأن 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 هي _ دائمًا_ يتم استنتاجها. ونتيجة لذلك، Liftoff لن تنطلق المناسبة preload النصوص. (على وجه التحديد: ts-node/register سيفشل في التحميل)

briandamaged هل يمكنك تقديم إصلاح العلاقات العامة الذي لا يكسر الاختبارات الحالية؟

kibertoad + brunolm : سأحاول تجميع شيء ما إما في وقت لاحق اليوم أو غدًا. ما زلت أتأكد من فهمي للصورة الكبيرة أولاً. مما يمكنني قوله ، يبدو أن Knex CLI قد يكرر بعض الوظائف التي توفرها بالفعل مكتبة Liftoff .

briandamaged يمكن أن يكون. طالما اجتازت اختبارات cli حتى نعلم أننا لا نقدم تغييرات عاجلة للمستخدمين ، فلا تتردد في إعادة البناء بالعمق حسب الضرورة.

brunolmShGKmemmiszyilkka هذا يجب أن تعمل على نحو أفضل في 0.20.9 بفضل عمل مدهش منbriandamaged. يرجى المحاولة وإخباري إذا كانت التغييرات مفيدة لك.

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 Haha ، 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 التقييمات