前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【个人笔记】Nestjs使用TypeORM注意点

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

作者头像
w4ngzhen
发布2023-10-17 10:18:33
3280
发布2023-10-17 10:18:33
举报
文章被收录于专栏:编译思想编译思想

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

entities路径配置注意点

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

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

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

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

代码语言:javascript
复制
// 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这个目录下:

代码语言:javascript
复制
src
 - module
   - app.module.ts
 - entity
   - user
     - user.entity.ts

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

代码语言:javascript
复制
dist
 - module
   - app.module.js
 - entity
   - user
     - user.entity.js

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

代码语言:javascript
复制
join(__dirname, '**', "*.entity.{js,ts}")

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

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

Entity列配置注意点

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

代码语言:javascript
复制
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字段,来表示列名:

代码语言:javascript
复制
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;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-11-252,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • entities路径配置注意点
  • Entity列配置注意点
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档