Configuré un proyecto Typescript con TypeORM y tengo algunos problemas con la compilación.
La estructura de mi paquete es así:
root ├── db │ ├── migrations │ │ ├── a_migration.ts │ ├── connection │ │ ├── config.ts <- ormconfig │ │ ├── encrypt.ts │ │ ├── index.ts <- creates the connection ├── src │ ├── card │ │ ├── entity.ts ├── package.json ├── tsconfig.jsonMi config.ts es:
export = { type: 'postgres', host: POSTGRES_HOST, port: POSTGRES_PORT, username: POSTGRES_USER, password: POSTGRES_PASS, database: POSTGRES_DB, synchronize: true, logging: false, entities: ['**src/**/*entity.{ts,js}'], migrations: ['**/migrations/*.{ts,js}'], cli: { entitiesDir: 'src/entity', migrationsDir: 'db/migrations', }, namingStrategy: new SnakeNamingStrategy(), };tsconfig.json:
{ "compilerOptions": { "baseUrl": ".", "target": "es6", "module": "CommonJS", "allowJs": false, "esModuleInterop": true, "noImplicitAny": true, "resolveJsonModule": true, "outDir": "./build", "strict": true, "emitDecoratorMetadata": true, "experimentalDecorators": true }, "include": ["./src/*", "./db/*"], "exclude": ["./**/__tests__/*", "./**/__functionaltests__/*"] } Intenté reemplazar el prefijo ** en entidades y migraciones con path.join + __dirname pero luego typeorm no pudo detectar los archivos de migración y las entidades. Entiendo que esto tiene algo que ver con la ruta que resuelve dónde termina el código en la carpeta de build , pero no estoy seguro de cómo puedo abordar esto.
Si lo vivo así, la CLI funciona para el código sin compilar (ts) que ejecuta la aplicación con algo como nodemon pero no para el compilado (js).
El error que obtengo del js compilado es: SyntaxError: Cannot use import statement outside a module
Cualquier ayuda es apreciada, muchas gracias!
Sus entidades y migraciones deben recibir el directorio de compilación en lugar del directorio src.
Y synchronize debe establecerse como falso.
Intenta actualizar tus config.ts como se muestra a continuación:
export = { type: 'postgres', host: POSTGRES_HOST, port: POSTGRES_PORT, username: POSTGRES_USER, password: POSTGRES_PASS, database: POSTGRES_DB, synchronize: false, logging: false, entities: ['build/src/**/*entity.{ts,js}'], migrations: ['build/db/migrations/*.{ts,js}'], cli: { entitiesDir: 'src/entity', migrationsDir: 'db/migrations', }, namingStrategy: new SnakeNamingStrategy(), }; Tenga en cuenta los cambios en las propiedades de entities y migrations . Si esto no funcionó, lo más probable es que se deba a que las rutas que especifiqué no están dentro del directorio de build . En ese caso, cámbielos según sea necesario.
¡Espero que esto te ayude! Salud 🍻 !!!
Encontré un problema similar, tal vez esto podría ayudarte.
Estoy usando un ormconfig.js (no compilado) (nota, .js ) para migraciones como esta (la aplicación NestJS usa otra forma de establecer su conexión DB a través de TypeORM):
const { SnakeNamingStrategy } = require('typeorm-naming-strategies'); module.exports = { type: 'mysql', host: 'localhost', username: 'some user', database: 'some db', password: 'some pw', entities: ['./src/**/model/*.entity.ts'], migrations: ['migrations/*{.ts,.js}'], cli: { migrationsDir: 'src/migrations', }, namingStrategy: new SnakeNamingStrategy(), }; Mi IDE sugiere convertir esto en un módulo ES6, que cambia el require('typeorm-naming-strategies') en una declaración de import . Y si lo hago, obtendré:
SyntaxError: no se puede usar la declaración de importación fuera de un módulo
La salida adicional al error es:
import { SnakeNamingStrategy } from 'typeorm-naming-strategies'; ^^^^^^ Entonces, tal vez pueda reemplazar su import (¿no se muestra?) SnakeNamingStrategy a un require .
Solo una suposición, no estoy seguro si realmente te ayuda.
Cree variables de entorno para sus implementaciones. En config.ts, verifique el env y luego configure las entidades y las migraciones en consecuencia.