数据库的配置

node服务中,不论使用的express还是nest,都是有一些配置,环境的配置,数据库的配置等等; 那么俩者还是有些差别的;

这里我列举mongodb和redisnest中的使用;

Mongodb

依赖安装

首先安装依赖:

1
pnpm add @nestjs/mongoose mongoose

安装成功之后, 那么只需要在app.module.ts中配置:

1
2
3
4
5
6
7
8
import { Module } from "@nestjs/common";
import { MongooseModule } from "@nestjs/mongoose";

@Module({
// 不过建议可以将链接放到环境变量里,更安全
imports: [MongooseModule.forRoot("mongodb://localhost/nest")],
})
export class AppModule {}

这样就可以链接数据库了,数据库名为nest;不过这只是能保证数据库的连接,但是想要添加数据等操作还需要配置其他;

这里我按照一个例子去讲解,就比如添加用户, 运行nest-cli命令

1
nest g res users

这样会创建users文件夹

模型注入

创建文件user.schema.ts, 代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import { Prop, Schema, SchemaFactory } from "@nestjs/mongoose";
export const ADMIN_USER_MODEL_NAME = "db_admin_users";

@Schema()
export class Admin_User_Schema {
_id: string;
// 用户名
@Prop()
username: string;
// 密码
@Prop()
password: string;
}
export const AdminUserSchema = SchemaFactory.createForClass(Admin_User_Schema);

代码讲解:

  • @Schema 标记为数据库的模型(简单理解就是表结构), ADMIN_USER_MODEL_NAME 为数据库的表名, AdminUserSchema 为数据库的模型;
  • @Prop 标记为数据库的属性, username 为数据库的属性名, password 为数据库的属性名;
  • _id 为数据库的主键(mongodb 会自动生成主键,这里不写都没关系), @Prop 标记为数据库的属性, type 为数据库的类型, string 为数据库的类型;

这样数据库的表结构就设计完成了,接下来需要连接表,这样后续才能对表进行操作(CURD);

表链接

user目录下操作user.module.ts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import { Module } from "@nestjs/common";
import { UserService } from "./user.service";
import { UserController } from "./user.controller";
import { MongooseModule } from "@nestjs/mongoose";
import { ADMIN_USER_MODEL_NAME, AdminUserSchema } from "./schemas/user.schema";

@Module({
imports: [
// 核心代码
MongooseModule.forFeature([
{
// 表名
name: ADMIN_USER_MODEL_NAME,
// 表模型
schema: AdminUserSchema,
},
]),
],
controllers: [UserController],
providers: [UserService],
exports: [UserService],
})
export class UserModule {}

这样数据表是没有数据的,那么接着将一条测试数据添加在数据表里:

user.controller.ts中进行模型的注入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import { Controller, Post, Body, Get, Request } from "@nestjs/common";
import { UserService } from "./user.service";
export class UserController {
// 服务层
constructor(private readonly userService: UserService) {}

// 接口地址
@Post("create")
// 请求的参数
async create(@Body() body: { username: string; password: string }) {
// 调用的服务层
return await this.userService.create(body);
}
}

user.service.ts代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import { Injectable } from "@nestjs/common";
import { Model } from "mongoose";
import { InjectModel } from "@nestjs/mongoose";
import {
ADMIN_USER_MODEL_NAME,
Admin_User_Schema,
} from "./schemas/user.schema";
@Injectable()
export class UserService {
constructor(
@InjectModel(ADMIN_USER_MODEL_NAME)
private readonly userModel: Model<Admin_User_Schema>
) {}
async create(createUserDto: CreateUserDto) {
const result = await this.userModel.create(createUserDto);
return null;
}
}

当你使用apiFox or postman调用http://localhost:3000/create就会发现数据表里有一条数据了;

Redis

依赖安装

1
pnpm add @nestjs-modules/ioredis ioredis

安装成功之后,同样在app.module.ts中配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import { RedisModule } from '@nestjs-modules/ioredis';


@Module({
imports: [
RedisModule.forRootAsync({
useFactory: () => ({
type: 'single',
// 俩种方式
// url: process.env.REDIS_URL,
// 密码格式: redis"//密码@localhost:27017/nest-app
url: `redis://${process.env.REDIS_PWD ? process.env.REDIS_PWD + '@' : ''}${process.env.REDIS_HOST}:${process.env.REDIS_PORT}/${process.env.REDIS_DB}`,
}),
}),
]
})

模块注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import { InjectRedis } from "@nestjs-modules/ioredis";
import { Injectable } from "@nestjs/common";
import Redis from "ioredis";

@Injectable()
export class CacheService {
constructor(@InjectRedis() private readonly redis: Redis) {}

async get(key: string) {
return await this.redis.get(key);
}

async set(key: string, value: string, expire?: number) {
return expire
? await this.redis.set(key, value, "EX", expire)
: await this.redis.set(key, value);
}

async del(key: string) {
return await this.redis.del(key);
}
}