إصدار 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.أعتقد أن هذا ربما يكون مرتبطًا: 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. اكتشفنا أن أفضل طريقة للإنشاء هي كما يلي.
knex migrate:make --knexfile knexfile.ts -x ts <your-migration-name>
knex migrate:latest --knexfile knexfile.ts
knex seed:make --knexfile knexfile.ts -x ts <your-seed-name>
knex seed:run --knexfile knexfile.ts
لن يكون --knexfile knexfile.ts
ضروريًا إذا كنت تستخدم 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
التعليق الأكثر فائدة
نستخدم أيضًا
Knex
لكتابة الاستعلام إلى خادم PostgreSQL. اكتشفنا أن أفضل طريقة للإنشاء هي كما يلي.لن يكون
--knexfile knexfile.ts
ضروريًا إذا كنت تستخدمknexfile.js
نظرًا لأن الكتابة المطبوعة لا يمكنها أن توفر لك أي نوع من التحقق من ملف التكوين.