Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TypeORM Entity in NESTJS - Cannot use import statement outside a module

Tags:

typeorm

nestjs

Started new project with 'nest new' command. Works fine until I add entity file to it.

Got following error:

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

^^^^^^

SyntaxError: Cannot use import statement outside a module

What do I miss?

Adding Entity to Module:

import { Module } from '@nestjs/common';
import { BooksController } from './books.controller';
import { BooksService } from './books.service';
import { BookEntity } from './book.entity';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [TypeOrmModule.forFeature([BookEntity])],
  controllers: [BooksController],
  providers: [BooksService],
})
export class BooksModule {}

app.module.ts:

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Connection } from 'typeorm';
import { BooksModule } from './books/books.module';

@Module({
  imports: [TypeOrmModule.forRoot()],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
like image 779
Anton Avatar asked Dec 21 '19 10:12

Anton


4 Answers

My assumption is that you have a TypeormModule configuration with an entities property that looks like this:

entities: ['src/**/*.entity.{ts,js}']

or like

entities: ['../**/*.entity.{ts,js}']

The error you are getting is because you are attempting to import a ts file in a js context. So long as you aren't using webpack you can use this instead so that you get the correct files

entities: [join(__dirname, '**', '*.entity.{ts,js}')]

where join is imported from the path module. Now __dirname will resolve to src or dist and then find the expected ts or js file respectively. let me know if there is still an issue going on.

EDIT 1/10/2020

The above assumes the configuration is done is a javascript compatible file (.js or in the TypeormModule.forRoot() passed parameters). If you are using an ormconfig.json instead, you should use

entities: ["dist/**/*.entity.js"]

so that you are using the compiled js files and have no chance to use the ts files in your code.

like image 141
Jay McDoniel Avatar answered Oct 11 '22 13:10

Jay McDoniel


In the TypeORM documentation, i found a specific section for Typescript.

This section says:

Install ts-node globally:

npm install -g ts-node

Add typeorm command under scripts section in package.json

"scripts" {
    ...
    "typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js"    
}

Then you may run the command like this:

npm run typeorm migration:run

If you need to pass parameter with dash to npm script, you will need to add them after --. For example, if you need to generate, the command is like this:

npm run typeorm migration:generate -- -n migrationNameHere

This works with my file config:

{
    "type": "postgres",
    "host": "yourhost",
    "port": 5423,
    "username": "username",
    "password": "password",
    "database": "your_db",
    "synchronize": true,
    "entities": [
        "src/modules/**/*.entity.{ts,js}"
    ],
    "migrations": [
        "src/migrations/**/*.{ts,js}"
    ],
    "cli": {
        "entitiesDir": "src/modules",
        "migrationsDir": "src/migrations"
    }
}

Then you can run the generate command.

like image 28
Fabio Cortez Avatar answered Oct 11 '22 12:10

Fabio Cortez


As Jay McDoniel explained in his answer, the problem seems to be the pattern matching of entity files in ormconfig.json file: Probably a typescript file (module) is imported from a javascript file (presumably a previously transpiled typescript file).

It should be sufficient to remove an existing ts glob pattern in the ormconfig.json, so that TypeORM will only load javascript files. The path to the entity files should be relative to the working directory where node is executed.

   "entities"   : [
      "dist/entity/**/*.js"
   ],
   "migrations" : [
      "dist/migration/**/*.js"
   ],
   "subscribers": [
      "dist/subscriber/**/*.js"
   ],
like image 22
iY1NQ Avatar answered Oct 11 '22 13:10

iY1NQ


I changed in tsconfig.json file next:

"module": "es6"

To:

"module": "commonjs",

It helps me

like image 11
Max Avatar answered Oct 11 '22 11:10

Max