Knex: ترحيل: جعل الفشل مع TypeScript

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

بيئة

إصدار Knex: 0.16.3 (باستخدام TypeScript knexfile)
إصدار قاعدة البيانات +: PostgreSQL 10.5
نظام التشغيل: Windows 10 Pro 64 Bit

خلل برمجي

عند تشغيل knex migrate:make somename ، هذا هو الناتج:

Requiring external module ts-node/register
Using environment: development
TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received type undefined
    at assertPath (path.js:39:11)
    at Object.resolve (path.js:166:7)
    at directories.map.directory (X:\Code\node\knextest\node_modules\knex\lib\migrate\MigrationGenerator.js:82:28)
    at Array.map (<anonymous>)
    at MigrationGenerator._absoluteConfigDirs (X:\Code\node\knextest\node_modules\knex\lib\migrate\MigrationGenerator.js:81:24)
    at MigrationGenerator._ensureFolder (X:\Code\node\knextest\node_modules\knex\lib\migrate\MigrationGenerator.js:41:23)
    at MigrationGenerator.make (X:\Code\node\knextest\node_modules\knex\lib\migrate\MigrationGenerator.js:35:17)
    at Migrator.make (X:\Code\node\knextest\node_modules\knex\lib\migrate\Migrator.js:122:27)
    at Command.commander.command.description.option.action (X:\Code\node\knextest\node_modules\knex\bin\cli.js:179:10)
    at Command.listener (X:\Code\node\knextest\node_modules\commander\index.js:315:8)
    at Command.emit (events.js:182:13)
    at Command.parseArgs (X:\Code\node\knextest\node_modules\commander\index.js:654:12)
    at Command.parse (X:\Code\node\knextest\node_modules\commander\index.js:474:21)
    at Liftoff.invoke (X:\Code\node\knextest\node_modules\knex\bin\cli.js:278:13)
    at Liftoff.execute (X:\Code\node\knextest\node_modules\liftoff\index.js:203:12)
    at module.exports (X:\Code\node\knextest\node_modules\flagged-respawn\index.js:51:3)

هذا هو محتوى knexfile.ts :

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

بعض التفاصيل الإضافية:

  • knex migrate:make somename يعمل إذا قمت بتغيير امتداد الملف knexfile إلى .js . (كنكس 0.16.3)
  • knex migrate:make somename كما ينبغي مع TypeScript knexfile عند استخدام حزمة knex 0.15.1 و @types/knex 0.15.1.
  • لم أجرب محركات قواعد بيانات مختلفة أو الإصدارات بين knex 0.15.1 - 0.16.3.
bug migrations

التعليق الأكثر فائدة

نستخدم أيضًا Knex لكتابة الاستعلام إلى خادم PostgreSQL. اكتشفنا أن أفضل طريقة للإنشاء هي كما يلي.

  1. إنشاء ملف الترحيل
knex migrate:make --knexfile knexfile.ts -x ts <your-migration-name>
  1. قم بتشغيل ملف الترحيل
knex migrate:latest --knexfile knexfile.ts 
  1. توليد ملف البذور
knex seed:make --knexfile knexfile.ts -x ts <your-seed-name>
  1. تشغيل ملف البذور
knex seed:run --knexfile knexfile.ts 

لن يكون --knexfile knexfile.ts ضروريًا إذا كنت تستخدم knexfile.js نظرًا لأن الكتابة المطبوعة لا يمكنها أن توفر لك أي نوع من التحقق من ملف التكوين.

ال 27 كومينتر

أعتقد أن هذا ربما يكون مرتبطًا: https://github.com/tgriesser/knex/issues/2998
أستطيع أن أؤكد أنه يعمل مع 0.15.2 ، لكن ليس مع 0.16.x

أعتقد أن هذا ربما يكون مرتبطًا: # 2998
أستطيع أن أؤكد أنه يعمل مع 0.15.2 ، ولكن ليس 0.16.x

كلا ، هذه قضية مختلفة. ويمكنني أن أؤكد أن # 2998 لا يمكن إعادة إنتاجه بالمعلومات المقدمة.

يبدو أن حل knexfile التلقائي لا يبحث عن knexfile.ts ، يمكنك تمرير وسيطة --knexfile knexfile.ts للأمر أو إعطاء المسار مباشرة إلى أمر منشئ الترحيل باستخدام:

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

أفترض أن العميل يجب أن يبحث عن knexfile.ts تلقائيًا بالرغم من ذلك.

لاحظت هذا لأول مرة باستخدام migrate:latest ، والذي يثير بشكل مثير للاهتمام خطأ مختلف عن migrate:make . إليك نسخة بسيطة حيث يمكنك رؤية كليهما: https://github.com/jrr/knex-ts-issue-repro

لاحظنا اليوم أيضًا أن knex --knexfile knexfile.ts migrate:make (...) سينشئ ملف .js بدلاً من ts. (في السابق ، عندما كانت knex تلتقط تلقائيًا knexfile.ts ، فإنها ستنتج أيضًا تهجيرات ts تلقائيًا)

نستخدم أيضًا Knex لكتابة الاستعلام إلى خادم PostgreSQL. اكتشفنا أن أفضل طريقة للإنشاء هي كما يلي.

  1. إنشاء ملف الترحيل
knex migrate:make --knexfile knexfile.ts -x ts <your-migration-name>
  1. قم بتشغيل ملف الترحيل
knex migrate:latest --knexfile knexfile.ts 
  1. توليد ملف البذور
knex seed:make --knexfile knexfile.ts -x ts <your-seed-name>
  1. تشغيل ملف البذور
knex seed:run --knexfile knexfile.ts 

لن يكون --knexfile knexfile.ts ضروريًا إذا كنت تستخدم knexfile.js نظرًا لأن الكتابة المطبوعة لا يمكنها أن توفر لك أي نوع من التحقق من ملف التكوين.

أي خطط لإصلاح ذلك؟ من الصعب زيادة اعتماد Knex مع هذه المشكلة: /

dgadelha شكرا على التذكير! سألقي نظرة اليوم أو غدا.

dgadelha تم إصدار 0.17.6 مع الإصلاح الخاص بذلك. لسوء الحظ ، لن يتوفر الإصلاح لحل التمديد من امتداد knexfile إلا على المستوى الرئيسي (بدءًا منه الآن).

من فضلك اعد النظر!
https://github.com/tgriesser/knex/pull/3282

لاحظنا اليوم أيضًا أن knex --knexfile knexfile.ts migrate:make (...) سينشئ ملف .js بدلاً من ts. (في السابق ، عندما كانت knex تلتقط تلقائيًا knexfile.ts ، فإنها ستنتج أيضًا تهجيرات ts تلقائيًا)

kibertoad تم تثبيت 0.17.6 للتو ولا يزال هذا السلوك يحدث ، حتى عند تحديد ".ts" في Knexfile. هل هم حشرات منفصلة؟

mathieumg نعم. راجع العلاقات العامة التي قمت بإنشائها منذ دقيقتين وأشير إليها من هذه المشكلة: د

@ kibertoad فعلت! الوصف يجعل الأمر يبدو كما لو كان بدلاً من ذلك لاستنتاج الامتداد بناءً على نفس الامتداد مثل Knexfile ، لذلك لم أكن متأكدًا.

The description makes it sounds like that was rather for inferring the extension based on the same extension as the Knexfile -> حسنًا ، يتعلق الأمر بالاستنتاج التلقائي للتمديد من knexfile ، بغض النظر عما إذا كان محددًا بشكل صريح أو الذي تم حله تلقائيًا.
0.17.6 حل تلقائي ثابت لملفات knexfiles TS.

حسنا! لأن 0.17.6 مع extension: "ts" ما زالت تعطي نتيجة ".js". شكرا لإصلاح هذه الأخطاء! 😄

لأن 0.17.6 مع الامتداد: "ts" ما زالت تعطي نتيجة ".js"

آه ، تقصد أن لديك ملف knexfile

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

فيه؟ تم إصلاح ذلك في https://github.com/tgriesser/knex/commit/a65a95bc672563e01c08b40384e1dc2b079ecee1 ، يمكنك الوصول إليه بالفعل عن طريق قفل نسختك في هذا الالتزام (إذا كنت لا تريد الإشارة إلى Master مباشرةً).
لسوء الحظ ، لن يتم نقله إلى 0.17

0.18.0 لا يزال أمامك تمامًا ، ولكن إذا لم يكن الاعتماد على الالتزامات خيارًا لك ، فيمكنني إصدار next-1 بدلاً من ذلك.

مرحبًا ، لقد علقت على العلاقات العامة ، شكرًا جزيلاً!

kibertoad رائع ، شكرًا على الدقة! يمكننا أن ننتظر 0.18 ، لا ضغوط. 😄

kibertoad لا يعمل الالتزام الذي تشير إليه إلا إذا تم تحديده مباشرةً

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

لكن كائن التهجير الذي يحدد مكان وضع الهجرات والقراءة منها يجب تحديده تحته

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

إذا قمت بنقل الكائن migrations خارج كائن البيئة ، فسيتم تجاهل دليل الترحيلات.

ViggoV شكرا لتقرير الخطأ! سنحاول معالجة هذا اليوم.

ViggoV هل يمكنك تجربة أحدث نسخة رئيسية وتقديم تقرير إذا كان يعمل بشكل صحيح في حالتك الآن؟

تم إصداره في 0.18.0-next2

عذرًا ، انتهى بي الأمر بالتبديل إلى { ext: 'ts' } والذي يعمل كما أتوقع ولكن لا يبدو أنه موثق. سأختبر عندما يكون لدي الوقت

مرحبا كان لدي نفس المشكلة. لقد قمت بحل طلب ts-node / التسجيل في ملف knexfile.ts الخاص بي مثل هذا

"
تتطلب ('ts-node / Register')
const s = تتطلب ("./ settings.js") ؛
module.exports = {

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

}
} ؛

"

لا أعرف ما إذا كنت قد قمت بحل المشكلة بالفعل ولكن في حالتي كان الحل بسيطًا للغاية. أنا فقط أنقل _knexfile.js_ إلى جذر المشروع. لقد قمت بتثبيت knex في الدليل "/ backend" ولكن لسبب غير معروف انتقل الملف إلى دليل آخر. لذلك قمت بنقل knexfile.js إلى "backend / knexfile.js" ويعمل بشكل

مرحبًا moacirandretti ، إن ملفي knexfile.ts موجود في مشروع الجذر ، ولكن cli heroku heroku run knex --knexfile knexfile.ts migrate: latest
إعادة هذه الرسالة.

Running knex --knexfile knexfile.ts migrate: latest on ⬢ backend-ecolab ... up, run.5056 (Free)
Failed to load external module ts-node / register
Failed to load external module typescript-node / register
Failed to load external module typescript-register
Failed to load external module typescript-require
Failed to load external module sucrase / register / ts
Failed to load external module @ babel / register
Error: Cannot find module 'ts-node / register'
Require stack:
- /app/knexfile.ts
- /app/node_modules/knex/bin/cli.js
    at Function.Module._resolveFilename (internal / modules / cjs / loader.js: 966: 15)
    at Function.Module._load (internal / modules / cjs / loader.js: 842: 27)
    at Module.require (internal / modules / cjs / loader.js: 1026: 19)
    at require (internal / modules / cjs / helpers.js: 72: 18)
    at Object. <anonymous> (/app/knexfile.ts:1:1)
    at Module._compile (internal / modules / cjs / loader.js: 1138: 30)
    at Object.Module._extensions..js (internal / modules / cjs / loader.js: 1158: 10)
    at Module.load (internal / modules / cjs / loader.js: 986: 32)
    at Function.Module._load (internal / modules / cjs / loader.js: 879: 14)
    at Module.require (internal / modules / cjs / loader.js: 1026: 19)

لقد قمت بتثبيت هذه الحزمة ts-node في تبعية dev

واجهت نفس الخطأ.
knexfile.ts:

import dotenv from "dotenv";
import { Config } from "knex";
dotenv.config();

interface KnexConfig {
  [name: string]: Config;
}

const knexConfig: KnexConfig = {
  development: {
    client: "pg",
    connection: {
      host: process.env.DB_HOST || "127.0.0.1",
      user: process.env.DB_USERNAME || "postgres",
      password: process.env.DB_PASSWRORD || "postgres",
      database: process.env.DB_DEV_NAME || "done_list",
    },
    migrations: {
      directory: "./migrations",
      extension: "ts",
    },
  },
  test: {
    client: "pg",
    connection: {
      host: process.env.DB_HOST || "127.0.0.1",
      user: process.env.DB_USERNAME || "postgres",
      password: process.env.DB_PASSWRORD || "postgres",
      database: process.env.DB_DEV_NAME || "done_list_test",
    },
  },
};

export { knexConfig };

عند تشغيل knex migrate:make user حصلت على خطأ ، ولكن عندما أشغل knex migrate:make --migrations-directory ./scr/migrations -x ts user كما هو مذكور في هذا التعليق .

الطباعة المطبوعة: 4.0.2
كنكس: 0.21.5
@ أنواع / كنكس: 0.16.1

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

fsebbah picture fsebbah  ·  3تعليقات

marianomerlo picture marianomerlo  ·  3تعليقات

mishitpatel picture mishitpatel  ·  3تعليقات

rarkins picture rarkins  ·  3تعليقات

nklhrstv picture nklhrstv  ·  3تعليقات