NESTJS中的TypeORM实体-无法在模块外部使用import语句


11

使用“嵌套新”命令启动新项目。正常工作,直到我向其中添加实体文件。

出现以下错误:

从'typeorm'导入{Entity,Column,PrimaryGeneratedColumn};

^^^^^^

SyntaxError:无法在模块外部使用import语句

我想念什么?

向模块添加实体:

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 {}

从'@ nestjs / common'导入{模块};
普雷斯顿

@Preston在意您的意思吗?您是否需要为常用共享文件创建模块?
约书亚·

您是从linter还是从编译中获取错误?您在哪里有这个新文件?它在您的src目录中吗?如果您使用的是TypeORM,可以TypeOrmModuleAppModuleimports数组中显示导入内容吗?我们看不到的配置可能有问题
Jay McDoniel

实体进口信息的最新信息
Anton

Answers:


19

我的假设是您有一个TypeormModule配置,其entities属性如下所示:

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

或喜欢

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

您收到的错误是因为您试图tsjs上下文中导入文件。只要您不使用webpack,就可以使用它来获取正确的文件

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

其中join,从进口path模块。现在__dirname将解析为srcdist,然后分别找到所需的tsjs文件。让我知道是否仍然存在问题。

编辑1/10/2020

上面假设配置完成是一个javascript兼容文件(.js或在TypeormModule.forRoot()传递的参数中)。如果您使用的是ormconfig.json,则应使用

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

这样您就可以使用已编译的js文件,而没有机会在代码中使用ts文件。


1
但这是一团糟。一个不接受用于迁移的打字稿的打字稿ORM ...
Madeo

deno是唯一的本机打字稿代码运行器。TypeORM,尽管它使用Typescript,但仍可与NodeJavaScript运行时一起使用。也许可以改进,接受ts文件,并将它们编译成JavaScript的引擎盖下,然后将其删除,以便最终用户不会看到他们,但是这将需要被提了出来对TypeORM Git仓库中的一个问题
杰伊McDoniel

4

正如Jay McDoniel在回答中所解释的那样,问题似乎出在ormconfig.json文件中实体文件的模式匹配:可能是从javascript文件(大概是以前编译的打字稿文件)导入了打字稿文件(模块)。

删除中的现有tsglob模式就足够了ormconfig.json,以便TypeORM仅加载javascript文件。实体文件的路径应相对于执行节点的工作目录。

   "entities"   : [
      "dist/entity/**/*.js"
   ],
   "migrations" : [
      "dist/migration/**/*.js"
   ],
   "subscribers": [
      "dist/subscriber/**/*.js"
   ],

src也许应该改为dist为这就是可运行的代码是被transpiled的JavaScript后。
杰·麦克唐尼尔

谢谢,我更新了路径。
iY1NQ

2

在TypeORM文档中,我找到了Typescript的特定部分。

本节说:

全局安装ts-node:

npm install -g ts-node

在package.json的脚本部分下添加typeorm命令

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

然后,您可以运行以下命令:

npm run typeorm migration:run

如果需要将带有破折号的参数传递给npm脚本,则需要在-之后添加它们。例如,如果您需要生成,则命令如下所示:

npm run typeorm migration:generate -- -n migrationNameHere

这适用于我的文件配置:

{
    "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"
    }
}

然后,您可以运行generate命令。


这应该是公认的答案
Nico Li

1

您需要为应用程序的每个部分都有一个something.module.ts。它的工作原理类似于Angular。这是使用GraphQL解析器和服务设置的。REST与控制器有些不同。每个模块可能都有一个实体,如果是GraphQL,则可能有projects.schema.graphql。

projects.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ProjectsService } from './projects.service';
import { Projects } from './projects.entity';

import { ProjectsResolvers } from './projects.resolvers';

@Module({
  imports: [
    TypeOrmModule.forFeature([Projects])],
  providers: [
    ProjectsService,
    ProjectsResolvers
  ],

})

export class ProjectsModule {}

优秀的。那么,这是否意味着您可以在多个模块之间共享一个基本实体,还是该基本实体必须是某种公共模块的一部分?
约书亚·德莱昂

可能像Angular一样,但从未尝试过。
普雷斯顿

如果可行,请将其标记为答案。
普雷斯顿

我想我已经将实体导入模块了。请查看更新的帖子
Anton

1
安东(Anton),如果您已解决此问题,请发布您的解决方案。
普雷斯顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.