首页 > 其他分享 >【个人笔记】Nestjs使用TypeORM注意点

【个人笔记】Nestjs使用TypeORM注意点

时间:2022-11-26 10:56:33浏览次数:50  
标签:name 笔记 ts module entity entities Nestjs js TypeORM

在Nestjs使用TypeORM还是有一些注意点。

entities路径配置注意点

在nestjs中使用TypeORM,需要配置数据库连接(以MySQL为例)。需要特别注意的是配置参数里面的entities字段:

{
    "type": "mysql",
    "host": "localhost",
    "port": 3306,
    "username": "root",
    "password": "root",
    "database": "zen-im",
    "entities": ["**/*.entity.{ts,js}"],
    "synchronize": true
}

entities字段的作用是根据提供的路径字符串,在运行的时候查找对应路径下的entity文件。

首先,我建议最好直接在使用 TypeORM.forRoot 来引入配置,就像下面一样:

// app.module.ts
const entitiesPaths = [join(__dirname, '..', '**', '*.entity.{ts,js}')]
@Module({
    imports: [
        TypeOrmModule.forRoot({
                "type": "mysql",
                "host": "localhost",
                "port": 3306,
                "username": "root",
                "password": "root",
                "database": "zen-im",
                "entities": entitiesPaths,
                "synchronize": true
            }
        )],
    controllers: [AppController],
    providers: [AppService],
})
export class AppModule {
}

这样做的原因在于,能够控制entities的搜索路径。在上面例子中,我控制的路径是当前运行js路径(__dirname)的上一层(..)目录中的任意(**)子目录中,搜索所有的以.entity.js.entity.ts作为后缀的文件作为扫描为entity文件。

之所以使用了上一层(..),是因为我的项目中,上面这个app.module.ts放在了src/module目录下,而我的所有entity.ts都在放在src/entity这个目录下:

src
 - module
   - app.module.ts
 - entity
   - user
     - user.entity.ts

最终生成出来的js代码,会放在项目根目录/dist目录下:

dist
 - module
   - app.module.js
 - entity
   - user
     - user.entity.js

所以在实际运行中,app.module.js中配置entities这个字段的时候,需要返回上一层(..),才能查找到。如果你的项目中,app.module.ts就在src目录下,entity存放路径就在app.module.ts所在的子目录,就可以直接配置成:

join(__dirname, '**', "*.entity.{js,ts}")

如果这个路径配置不一致,运行的时候,会出现以下的错误:

  • EntityMetadataNotFoundError: No metadata for "你的Entity" was found.

Entity列配置注意点

这个地方比较细节,笔者编写代码的时候,按照曾经Java的MyBatis-Plus注解使用,给字段添加列定义的时候。不小心直接把名称字符串作为参数:

import {Column, Entity, PrimaryColumn} from "typeorm";

@Entity('user')
export class UserPo {
    /**
     * 全局唯一ID
     */
    @PrimaryColumn('uid')
    uid: string;
    /**
     * 用户名
     */
    @Column('name')
    name: string;
}

运行的时候,就出现了:

  • DataTypeNotSupportedError: Data type "uid" in "UserPo.uid" is not supported by "mysql" database.

原因在于装饰器@PrimaryColumn或者@Column的参数如果是一个字符串,则视为一个数据库的类型!要传一个对象,这个对象有个name字段,来表示列名:

import {Column, Entity, PrimaryColumn} from "typeorm";

@Entity('user')
export class UserPo {
    /**
     * 没有业务逻辑含义的全局唯一ID
     */
-    @PrimaryColumn('uid')
+    @PrimaryColumn({
+        name: 'uid'
+    })
    uid: string;
    /**
     * 用户名
     */
-    @Column('name')
+    @Column({
+       name: 'name'
+   })
    name: string;
}

标签:name,笔记,ts,module,entity,entities,Nestjs,js,TypeORM
From: https://www.cnblogs.com/w4ngzhen/p/16927043.html

相关文章

  • CS149笔记Cache一致性
    Cache一致性关于Cache,我感觉通过这门课程学习到的内容可能还不够。我现在思考Cache读Memory有点像思考Memory读SSD。Cache每次都需要从Memory读64B,而内存读SSD每次都会......
  • 《架构师修炼之道》读书笔记
    学点架构师思维和技能总是有益的。架构是关于软件系统的一系列重大设计决策的有机整体,实现期望的质量属性和业务目标。架构是站在系统全局视角思考和构建软件,解决问题......
  • 阅读 OSTEP 第一、二章笔记
    虚拟化不等于虚拟机不等于Hypervisor,定义如下TheprimarywaytheOSdoesthisisthroughageneraltechniquethatwecallvirtualization.Thatis,theOStakesa......
  • sklearn 学习笔记
    文章中大部分例子的代码sklearnexamples-colab参考文档:用户指南-scikit-learn中文社区APIReference安装pipinstall-Uscikit-learn从一个例子开始使......
  • [南京大学2022操作系统-蒋炎岩-P2] 笔记
    不得不说,X-macro真是个好魔法 使用C语言模拟状态机,再把它的输出传递给python数码管模拟器 ......
  • react hook 学习笔记
    React提供的Hooks其实非常少,一共只有10个,比如useState、useEffect、useCallback、useMemo、useRef、useContext等等。这一讲我们会先学习useState和useEffect这......
  • MIT6.828 学习笔记2(Lab2)
    Lab2:MemoryManagement前置芝士:Intel80386ReferenceManual第五章内存管理和第六章保护机制是在做本次lab前需要详细了解的。Part1:PhysicalPageManagement......
  • TypeScript学习笔记-03 TS基础语法
    即使有错还是可以编译为JS文件。ts方法指定参数的类型,指定返回值的类型:这样都会对返回值的类型和参数都会进行校验!......
  • 详解支持向量机-硬间隔与软间隔:重要参数C【菜菜的sklearn课堂笔记】
    视频作者:菜菜TsaiTsai链接:【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili我们之前在理论推导中使用的数据都有一个特点,那就是他们或是完全......
  • AutoLisp开发读书笔记(2):Lisp的条件控制分支函数Repeat、While用法
    Lisp的条件控制分支函数Repeat、While用法......