Knex: ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ : TypeScript์—์„œ make ์‹คํŒจ

์— ๋งŒ๋“  2019๋…„ 01์›” 18์ผ  ยท  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 ๋ณ€๊ฒฝํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. (knex 0.16.3)
  • knex migrate:make somename ๋Š” knex 0.15.1 ๋ฐ @types/knex 0.15.1 ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ TypeScript knexfile๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • knex 0.15.1-0.16.3 ์‚ฌ์ด์˜ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„ ๋˜๋Š” ๋ฒ„์ „์„ ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
bug migrations

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋˜ํ•œ PostgreSQL ์„œ๋ฒ„์— ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ Knex ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  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 ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. typescript๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์— ๋Œ€ํ•œ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  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 (...) ๋Š” .ts ๋Œ€์‹  .js ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. (์ด์ „์—๋Š” knex๊ฐ€ ์ž๋™์œผ๋กœ knexfile.ts ๋ฅผ ์„ ํƒํ•˜๋ฉด .ts ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋„ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.)

๋˜ํ•œ PostgreSQL ์„œ๋ฒ„์— ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ Knex ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  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 ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. typescript๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์— ๋Œ€ํ•œ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์„ ๊ณ ์น  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ๋ฌธ์ œ๋กœ Knex ์ฑ„ํƒ์„ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์ด ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค.

@dgadelha ์•Œ๋ฆผ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์˜ค๋Š˜ ๋˜๋Š” ๋‚ด์ผ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

@dgadelha 0.17.6์ด ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•ˆํƒ€๊น๊ฒŒ๋„ knexfile ํ™•์žฅ์—์„œ ํ™•์žฅ์„ ํ•ด๊ฒฐํ•˜๊ธฐ์œ„ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์€ ๋งˆ์Šคํ„ฐ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ง€๊ธˆ๋ถ€ํ„ฐ ์‹œ์ž‘).

๊ฒ€ํ† ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค!
https://github.com/tgriesser/knex/pull/3282

๋˜ํ•œ ์˜ค๋Š˜ knex --knexfile knexfile.ts migrate:make (...) ๋Š” .ts ๋Œ€์‹  .js ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. (์ด์ „์—๋Š” knex๊ฐ€ ์ž๋™์œผ๋กœ knexfile.ts ๋ฅผ ์„ ํƒํ•˜๋ฉด .ts ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋„ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.)

@kibertoad ๋ฐฉ๊ธˆ

@mathieumg ๋„ค. ๋ช‡ ๋ถ„ ์ „์— ์ž‘์„ฑํ–ˆ๊ณ  ์ด๋ฒˆ ํ˜ธ์—์„œ ์ฐธ์กฐํ•œ PR์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

@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 knexfile์˜ ๊ณ ์ • ์ž๋™ ํ•ด์ƒ๋„.

์ข‹๊ตฌ๋‚˜! extension: "ts" 0.17.6์ด ์—ฌ์ „ํžˆ ".js"๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ • ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ˜„

ํ™•์žฅ์ž๊ฐ€ "ts"์ธ 0.17.6์ด ์—ฌ์ „ํžˆ ".js"๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์—

์•„, ๋‹น์‹ ์€ knexfile์ด

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

๊ทธ ์•ˆ์—? https://github.com/tgriesser/knex/commit/a65a95bc672563e01c08b40384e1dc2b079ecee1 ์—์„œ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.์ด ์ปค๋ฐ‹์—์„œ ๋ฒ„์ „์„ ์ž ๊ทธ๋ฉด ์ด๋ฏธ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋งˆ์Šคํ„ฐ๋ฅผ ์ง์ ‘ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒฝ์šฐ).
๋ถˆํ–‰ํžˆ๋„ 0.17๋กœ ๋ฐฑ ํฌํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

0.18.0์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ƒ๋‹นํžˆ ์•ž์„œ ์žˆ์ง€๋งŒ ์ปค๋ฐ‹์— ๋”ฐ๋ผ ์˜ต์…˜์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋Œ€์‹  next-1์„ ๋ฆด๋ฆฌ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, PR์— ๋Œ“๊ธ€์„ ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@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๊ฐ€ ํ•„์š”ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

`
ํ•„์š” ( 'ts-node / register')
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_ ๋ฅผ ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ๋กœ "/ backend" ๋””๋ ‰ํ† ๋ฆฌ์— knex๋ฅผ ์„ค์น˜ํ–ˆ์ง€๋งŒ ์•Œ ์ˆ˜์—†๋Š” ์ด์œ ๋กœ ํŒŒ์ผ์ด ๋‹ค๋ฅธ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ 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
knex : 0.21.5
@ types / knex : 0.16.1

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰