Skip to content

数据库的配置

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

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

Mongodb

依赖安装

首先安装依赖:

sh
pnpm add @nestjs/mongoose mongoose

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

ts
import { Module } from "@nestjs/common";
import { MongooseModule } from "@nestjs/mongoose";

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

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

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

sh
nest g res users

这样会创建users文件夹

模型注入

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

ts
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

ts
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中进行模型的注入:

ts
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代码如下:

ts
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

依赖安装

sh
pnpm add @nestjs-modules/ioredis ioredis

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

ts
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}`,
      }),
    }),
  ]
})

模块注入

ts
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);
	}
}

wangxiaoze | MIT License.