报错:
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
添加一下: