Версия Knex: 0.16.3 (с использованием файла TypeScript knexfile)
База данных + версия: PostgreSQL 10.5
ОС: Windows 10 Pro 64 бит
При запуске 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
работает так же, как и с Knexfile TypeScript при использовании пакета 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 Да. См. PR, который я создал пару минут назад и на который ссылается этот выпуск: D
@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 исправлено авторазрешение TS knexfiles.
Хорошо! Поскольку 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' }
который работает так, как я ожидал, но не задокументирован. Я буду тестировать, когда у меня будет время
Привет, у меня была такая же проблема. Я решил, что в моем knexfile.ts требуется ts-node / register, например
`
require ('ts-узел / регистр')
const s = require ("./ 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 в зависимости от разработчика
Я столкнулся с той же ошибкой.
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
knex: 0,21,5
@ типы / knex: 0.16.1
Самый полезный комментарий
Мы также используем
Knex
для записи запроса на сервер PostgreSQL. Мы обнаружили, что лучший способ генерировать следующий.--knexfile knexfile.ts
не потребуется, если вы используетеknexfile.js
поскольку машинописный текст не может предоставить вам какую-либо проверку типа для файла конфигурации.