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

NESTJS中的TypeORM实体-无法在模块外使用导入语句,nestjs,typeorm,Nestjs,Typeorm,已使用“nest new”命令启动新项目。工作正常,直到我添加实体文件到它 出现以下错误: 从“typeorm”导入{Entity,Column,PrimaryGeneratedColumn} ^^^^^^ SyntaxError:无法在模块外部使用导入语句 我错过了什么 将实体添加到模块: import { Module } from '@nestjs/common'; import { BooksController } from './books.controller'; import {

已使用“nest new”命令启动新项目。工作正常,直到我添加实体文件到它

出现以下错误:

从“typeorm”导入{Entity,Column,PrimaryGeneratedColumn}

^^^^^^

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

我错过了什么

将实体添加到模块:

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

你的应用程序的每个部分都需要一个something.module.ts。它的工作原理类似于角度。这是使用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 {}

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

entities: ['src/**/*.entity.{ts,js}']
npm run typeorm migration:run
npm run typeorm migration:generate -- -n migrationNameHere
或者

entities: ['../**/*.entity.{ts,js}']
您遇到的错误是因为您试图在
js
上下文中导入
ts
文件。只要你不使用webpack,你就可以使用它来获得正确的文件

entities: [join(__dirname, '**', '*.entity.{ts,js}')]
其中,
join
路径
模块导入。现在
\uu dirname
将解析为
src
dist
,然后分别找到所需的
ts
js
文件。如果仍有问题,请告诉我

编辑日期:2020年10月1日 以上假设配置是一个javascript兼容文件(
.js
或在
TypeormModule.forRoot()
传递的参数中完成的)。如果您使用的是
或mconfig.json
,则应该使用

实体:[“dist/***.entity.js”]

因此,您正在使用已编译的js文件,而没有机会在代码中使用ts文件。

正如Jay McDoniel在其回答中所解释的,问题似乎是
或mconfig.json
文件中实体文件的模式匹配:可能是从javascript文件导入了一个typescript文件(模块)(可能是以前传输的typescript文件)

删除
ormconfig.json
中现有的
ts
glob模式就足够了,这样TypeORM将只加载javascript文件。实体文件的路径应该相对于执行节点的工作目录

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

在TypeForm文档中,我找到了一个特定的部分

这一节说:

全局安装ts节点:

npm install -g ts-node
在package.json的scripts部分下添加typeorm命令

"scripts" {
    ...
    "typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js"    
}
然后可以按如下方式运行命令:

entities: ['src/**/*.entity.{ts,js}']
npm run typeorm migration:run
npm run typeorm migration:generate -- -n migrationNameHere
若您需要将带破折号的参数传递给npm脚本,则需要 要将它们添加到--。例如,如果需要生成 命令如下:

entities: ['src/**/*.entity.{ts,js}']
npm run typeorm migration:run
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命令。

我在tsconfig.json文件中更改了下一步:

"module": "es6"
致:


这对我很有帮助

当我面对这个问题时,我正在将Node.js与Typescript和TypeORM一起使用

entities: ['dist/**/*.entity.js']
我的ormconfig.json文件的完整代码:

{
  "type": "mysql",
  "host": "localhost",
  "port": 3306,
  "username": "xxxxxxxx",
  "password": "xxxxxxxx",
  "database": "typescript_orm",
  "synchronize": true,
  "logging": false,
  "migrationTableName": "migrations",
  "entities": [
    "dist/**/*.entity.js"
  ],
  "migrations": [
    "src/migration/**/*.{ts, js}"
  ],
  "suscribers": [
    "src/suscriber/**/*.{ts, js}"
  ],
  "cli": {
    "entitiesDir": "src/model",
    "migrationDir": "src/migration",
    "suscribersDir": "src/suscriber"
  }
}

官方文档中提到的在
或mconfig.json
中定义entities属性为我解决了这个问题

// This is your ormconfig.json file

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

这对我很有效-无需更改
或mconfig.js
。从根目录运行
节点\u模块

ts-node ./node_modules/typeorm/cli.js  migration:generate -n <MirgrationName> -c <ConnectionType>

支持迁移的配置:

//文件:src/config/ormconfig.ts
常量连接选项:连接选项={
//这里有其他配置
//我的ormconfig不在根文件夹中
实体:[`${uu dirname}/./***/.entity.{ts,js}`],
同步:false,
dropSchema:false,
迁移运行:false,
迁移:[getMigrationDirectory()],
cli:{
migrationsDir:'src/migrations',
}
}
函数getMigrationDirectory(){
const directory=process.env.NODE_env==“migration”?“src”:“${uu dirname}”;
返回`${directory}/migrations/***{.ts、.js}`;
}
导出=连接选项;
//FILE package.json
{
//这里有其他配置
“脚本”:{
“typeorm”:“NODE_ENV=migration ts NODE-r tsconfig path/register./NODE_modules/typeorm/cli.js--config src/config/database.ts”,
“typeorm:migrate”:“npm运行typeorm迁移:生成--n”,
“typeorm:run”:“npm运行typeorm迁移:run”,
“typeorm:revert”:“npm运行typeorm迁移:revert”
}
}

实际上,typeorm在默认情况下设计为与javascript一起工作

要使用typescript运行迁移,必须告诉typeorm这样做

只需将package.json放在下面这行的脚本部分:

"typeorm": "ts-node-dev ./node_modules/typeorm/cli.js"
然后,再次尝试迁移:

yarn typeorm migration:run

如果您使用typescript编写,并使用
tsc
创建一个包含已翻译js文件的dist文件夹,那么您可能有我的问题,它将在这里得到修复

正如在中提到的,如果您使用
nodemon server.js
,那么您将从js角度点击实体,它将无法识别导入,因为它与ts和es6相关。但是,如果您想从ts文件导入实体,您应该运行
ts node server.ts

就我个人而言,我认为前一个
node server.js
更安全,因为它更接近实际应用程序

!!!但是!!!如果更改实体名称,则必须非常小心地删除dist文件夹并重建它,否则它将抛出错误或意外工作。 发生此错误的原因是
tsc
将尝试翻译更改和创建的ts文件,并保留删除的文件,以便运行更快


我希望它有帮助,因为它肯定会在将来帮助我,因为我几乎肯定我会再次忘记它!

我认为一个比公认的更好的解决方案是在您选择的shell中创建一个别名,该别名使用
ts node
内部
node\u模块

注意:我在bash中使用OhMyZsh进行此操作,因此您的配置可能会完全不同

"g:migration": "yarn typeorm:local migration:generate -n"
npm run g:migration -- User
src/
├── app.controller.ts
├── app.module.ts
├── config
│   ├── configuration.ts
│   ├── ormconfig.ts
│   └── validation.ts
├── main.ts
├── model
│   ├── entity
│   ├── migration
│   └── repository
├── route
│   └── user
└── shared
    └── logger