FORMA

数据库的配置

归档:请优先阅读 NestJS 导读new/ 主线

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

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

Mongodb

依赖安装

首先安装依赖:

shell
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命令

shell
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

依赖安装

shell
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://:password@localhost:6379/0(Redis 默认端口 6379)
        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);
  }
}

连接串与密码请勿提交到版本库;生产环境使用环境变量或密钥管理服务。

参考文献

资料说明
MongoDB@nestjs/mongoose
Mongoose 文档ODM
@nestjs-modules/ioredisRedis 模块(第三方,使用前查阅 README)

Series

before

1 / 11

入手Demo