数据库的配置
在node
服务中,不论使用的express
还是nest
,都是有一些配置,环境的配置,数据库的配置等等; 那么俩者还是有些差别的;
这里我列举mongodb和redis
在nest
中的使用;
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
命令
这样会创建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: `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); } }
|