Knex: migrate: make не работает с TypeScript

Созданный на 18 янв. 2019  ·  27Комментарии  ·  Источник: knex/knex

Окружающая среда

Версия 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.
  • Я не пробовал разные движки баз данных или версии между 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 Да. См. 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

Была ли эта страница полезной?
0 / 5 - 0 рейтинги