NestJs框架getRepository方法废弃解决办法,顺便介绍一下typeORM框架

在这里插入图片描述
报错:

Connection "default" was not found.
...
...

因为 typeorm 版本不对,这是旧版的 api, 可以考虑降版本到 <0.3.0

解决

在这里插入图片描述

介绍一下 typeORM

我们如果直接使用 Node.js 操作 mysql 提供的接口, 那么编写的代码就比较底层, 例如一个插入数据代码:

connection.query(`INSERT INTO posts (title, content) VALUES ('${title}', '${content}')`,
    (err, data) => {
    if (err) { 
    console.error(err) 
    } else {
    console.log(data) 
    }
})

考虑到数据库表是一个二维表,包含多行多列,例如一个 posts 的表:

mysql> select * from posts;
+----+--------+------------+
| id | title       | content      |
+----+-------------+--------------+
|  1 | Nest.js入门 | 文章内容描述 |
+----+--------+------------+

每一行可以用一个 JavaScript 对象来表示, 比如第一行:

{
    id: 1,
    title:"Nest.js入门",
    content:"文章内容描述"
}

这就是传说中的ORM技术(Object-Relational Mapping),把关系数据库的变结构映射到对象上。
所以就出现了Sequelize、typeORM、Prisma这些ORM框架来做这个转换, (ps:Prisma呼声很高,喜欢探索的可以尝试一下)我们这里选择typeORM来操作数据库。 这样我们读写都是JavaScript对象,比如上面的插入语句就可以这样实现:

await connection.getRepository(Posts).save({title:"Nest.js入门", content:"文章内容描述"});

接下来就是真正意义上的使用typeORM操作数据库, 首先我们要安装以下依赖包:

npm install @nestjs/typeorm typeorm mysql2 -S

连接数据库

官方提供了两种连接数据库的方法, 这里分别介绍一下

方法1

首先在项目根目录下创建两个文件**.env.env.prod**,分别存的是开发环境和线上环境不同的环境变量:

# 数据库地址
DB_HOST=localhost
# 数据库端口
DB_PORT=3306
# 数据库登录名
DB_USER=root
# 数据库登录密码
DB_PASSWD=password
# 数据库名字
DB_DATABASE=database

.env.prod中的是上线要用的数据库信息,如果你的项目要上传到线上管理,为了安全性考虑,建议这个文件添加到 .gitignore
接着在根目录下创建一个文件夹 config(与src同级) ,然后再创建一个env.ts用于根据不同环境读取相应的配置文件

import * as fs from 'fs';
import * as path from 'path';
const isProd = process.env.NODE_ENV === 'production';

function parseEnv() {
  const localEnv = path.resolve('.env');
  const prodEnv = path.resolve('.env.prod');

  if (!fs.existsSync(localEnv) && !fs.existsSync(prodEnv)) {
    throw new Error('缺少环境配置文件');
  }

  const filePath = isProd && fs.existsSync(prodEnv) ? prodEnv : localEnv;
  return { path:filePath };
}
export default parseEnv();

然后在 app.module.ts 中连接数据库:

import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigService, ConfigModule } from '@nestjs/config';
import envConfig from '../config/env';

@Module({
  imports: [
    ConfigModule.forRoot({ 
    isGlobal: true,  // 设置为全局
    envFilePath: [envConfig.path] 
   }),
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: async (configService: ConfigService) => ({
        type: 'mysql', // 数据库类型
        entities: [],  // 数据表实体,
        host: configService.get('DB_HOST', 'localhost'), // 主机,默认为localhost
        port: configService.get<number>('DB_PORT', 3306), // 端口号
        username: configService.get('DB_USER', 'root'),   // 用户名
        password: configService.get('DB_PASSWORD', 'password'), // 密码
        database: configService.get('DB_DATABASE', 'database'), //数据库名
        timezone: '+08:00', //服务器上配置的时区
        synchronize: true, //根据实体自动创建数据库表, 生产环境建议关闭
      }),
    }),
    PostsModule,
  ],
 // ... 其他代码
})
export class AppModule {}

使用环境变量, 推荐使用官方提供的 @nestjs/config ,开箱即用,简单说明一下

@nestjs/config 依赖于 dotenv,可以通过 key=value 形式配置环境变量,项目会默认加载根目录下的 .env 文件,我们只需在 app.module.ts 中引入 ConfigModule,使用ConfigModule.forRoot() 方法即可,然后 ConfigService 读取相关的配置变量

TypeORM 提供了多种连接方式,还有一个 ormconfig.json 方式,可自行搜索

问题

如果你使用第一种方式连接数据库,这里还有一个小坑找不到 **** 实体

No repository for "****" was found.
Looks like this entity is not registered in current "default" connection?

是由于我们连接数据库时,没有注册它, 所有还需要在 app.module.ts 添加一下:

在这里插入图片描述

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星光菌子

你真是个富哥

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值