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