前言
想要做一个网盘项目,前端Vue + AntDesignVue ,后端 NestJs + Mongodb + Redis
刚开始做,才学了学Nest.js,想练手练手。
欢迎star
目前实现的
环境创建
github
新建一个仓库在GitHub上面
创建项目
nest new merikle-pan-backed
接着按照命令行安装依赖就可以了
配置git规范
可以看开发组件库配置环境 这篇文章中配置的git规范,来提交到github上
提交的时候,呈现的是这种效果
在仓库呈现这种效果
使用Swagger自动生成接口文档
- 安装Swagger包
pnpm install --save @nestjs/swagger
2. 添加以下内容(官网配置)
//新增的内容
const config = new DocumentBuilder()
.setTitle('Cats example')
.setDescription('The cats API description')
.setVersion('1.0')
.addTag('cats')
.build();
const document = SwaggerModule.createDocument(app, config);
SwaggerModule.setup('api', app, document);
接着让它跑起来
pnpm run start
在本地的https://localhost:3000/api可以看到你的文档
数据库
使用docker来进行部署mongodb,先在本地部署(主要是为了学习Docker哈哈哈),之后准备再去服务器部署
Docker
进行mongodb部署到docker里面,使用的是docker desktop
拉取镜像
# 最新版本 MongoDB
$ docker pull mongo
# 或者,指定需要的版本
$ docker pull mongo:4.0.4
创建容器
docker run --name docker_mongodb -v D:\Interview\merikle-pan\data:/data/db -d -p 27017:27017 mongo:latest --auth
进行数据卷的挂载,备份数据,将docker里面mongodb容器里面的数据储存到本机目录(可以写别的)D:\Interview\merikle-pan\data
接着进入mongodb容器
docker exec -it docker_mongodb mongo
接着进入admin数据库
mongosh admin
之后开始创建用户权限(创建超级管理员)
db.createUser({user: "admin", pwd: "admin", roles: [{role: "root", db: "admin"}]})
接着使用这个账号进行登录
db.auth("admin","admin")
最后就是跑在本机的Robot上面进行连接
下面填入你设置的账号和密码即可
连接数据库
- 创建一个文件夹
nest g lib db
2. 导入到main.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { DbModule } from '@libs/db';//新增的
@Module({
imports: [DbModule],//新增的
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
- 连接数据库,需要有连接数据库的模块,并且让我们从sql语句中变为面向对象的操作模式,使用mongoose来进行连接(因为我们使用的数据库为mongodb,所以准备使用monoose来连接数据库,关系型数据库可以使用typeorm连接)(官方文档配置)
pnpm i @nestjs/mongoose mongoose
在db.module.ts中进行连接
import { Module } from '@nestjs/common';
import { DbService } from './db.service';
import 'reflect-metadata';
import { MongooseModule } from '@nestjs/mongoose';
@Gobal()
@Module({
imports: [
MongooseModule.forRoot('mongodb://127.0.0.1:27017/pan', {
autoIndex: true,
autoCreate: true,
}),
],
providers: [DbService],
exports: [DbService],
})
export class DbModule {}
4. 在libs/db下面创建models来定义模型
之后就可以在这里面定义数据模型了
集成Redis
官方配置
安装redis-cli:需要在官方网站进行安装压缩包或者在docker desktop中安装redis,用的时候开启镜像就可以了,就是下面这个
- 项目中安装redis
pnpm i redis
2.
nest g lib redis
3. 在 RedisModule 创建连接 redis 的 provider,导出 RedisService,并把这个模块标记为 @Global 模块
import { Global, Module } from '@nestjs/common';
import { RedisService } from './redis.service';
import { createClient } from 'redis';//新增
@Global()//新增
@Module({
providers: [
RedisService,
//新增
{
provide: 'REDIS_CLIENT',
async useFactory() {
const client = createClient({
socket: {
host: 'localhost',
port: 6379,
},
});
await client.connect();
return client;
},
},
],
exports: [RedisService],
})
export class RedisModule {}
封装一些方法,存值,取值,删除,删除全部缓存
import { Inject, Injectable } from '@nestjs/common';
import { RedisClientType } from 'redis';
@Injectable()
export class RedisService {
@Inject('REDIS_CLIENT')
private redisClient: RedisClientType;
//封装一些方法
//获取值
async get(key: string) {
let value = await this.redisClient.get(key);
try {
value = JSON.parse(value);
} catch (error) {}
return value;
}
/**
* 设置值
* @param key {string} key
* @param value 值
* @param second 过期时间 秒
* @returns Promise<any>
*/
async set(key: string, value: any, second?: number) {
value = JSON.stringify(value);
return await this.redisClient.set(key, value, { EX: second });
}
//删除值
async del(key: string) {
return await this.redisClient.del(key);
}
//清除缓存
async flushAll() {
return await this.redisClient.flushAll();
}
}
实验一下
nest g resource test-redis
在test-redis中进行使用
import { Inject, Injectable } from '@nestjs/common';
import { CreateTestRediDto } from './dto/create-test-redi.dto';
import { UpdateTestRediDto } from './dto/update-test-redi.dto';
import { RedisService } from '../../libs/redis/src/redis.service';
@Injectable()
export class TestRedisService {
@Inject(RedisService)
private redisServices: RedisService;
create(createTestRediDto: CreateTestRediDto) {
return 'This action adds a new testRedi';
}
findAll() {
return `This action returns all testRedis`;
}
findOne(id: number) {
console.log(123);
//获取缓存内容
return this.redisServices.get('name').then((r) => {
console.log(r);
});
}
async findOne(id: number) {
const name = await this.redisServices.get('name');
console.log(name);
return `This action findOne a #${id} testRedi`;
}
remove(id: number) {
return `This action removes a #${id} testRedi`;
}
}
总结
好了,基本的弄好了,想着之后弄成Docker Compose(等我再研究研究,docker没学很多)