实现一个专注应用-后端开发(一)-搭建
搭建后端服务
- 搭建服务
- 拆分下用户服务
- 增加公共库
- 通用模块
- 运行一下
- 接入数据库
- 安装Prisma
- 增加prisma库
- redis
- 增加redis服务
搭建服务
使用nestjs来做 这里是nestjs的网站Nestjs
安装 nest
npm i -g @nestjs/cli
创建一个项目 并在开发工具打开
nest new todo
nest new xx 是新建一个项目
会让你选择包管理工具,我用的是pnpm
拆分下用户服务
在根目录下执行
nest g app user
这个时候 就拆分成了两个服务,方便分开维护,用户服务只负责用户的登录注册以及用户信息查询。
增加公共库
两个服务会有一些公共的依赖模块,比如数据库,装饰品,工具等等。这个时候需要抽离出来。
通用模块
主要存放一些 拦截器,装饰器,工具方法等,项目小,不再拆分模块,一般公用的都塞到一个里面。 当然也可以多拆分几个,装饰器丢到装饰器模块,拦截器都丢到拦截器模块。
nest g lib common
执行后一路回车。
此时目录结构为这样
运行一下
控制台执行
npm run start:dev todo
在apps/todo/src/main.ts可以看到port是3000,当然可以修改为你想要的。然后在浏览器中访问http://localhost:3000,显示了Hello World!。这里是调用了get请求,在apps/todo/src/app.controller.ts可以看到。
到这里一个简单的后端服务就搭建完成了。
接入数据库
接入数据库,用的mysql。mysql搭建教程有很多,这里不在阐述。
安装Prisma
这里的数据库管理工具使用Prisma。
npm install prisma --save-dev
初始化
npx prisma init
执行完成后 目录结构如下
点击.env 修改连接地址 如果是本地的mysql则为localhost否则修改为ip地址
DATABASE_URL="mysql://root:你的密码@localhost:3306/todo"
然后修改prisma/schema.prisma的数据库为mysql
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
如果你用的是vscode/cursor 可以安装下prisma的插件,有代码高亮会舒服很多,插件直接搜索prisma最多下载的就是。
我这里直接忽略了密码登录,如果需要 可以加个 password string
model User {
id String @id @default(uuid())
username String @unique
email String? @unique
wxId String? @unique
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([username], name: "username_idx")
@@index([email], name: "email_idx")
@@index([wxId], name: "wxId_idx")
}
重置下数据库
npx prisma migrate reset
生成下数据表
npx prisma migrate dev --name user
npx prisma migrate dev --name user 是一个 Prisma CLI 命令,用于在开发环境中创建和应用新的数据库迁移。以下是这个命令的具体含义和作用:
含义和作用
创建新的迁移: 该命令会根据当前的 Prisma schema 文件生成一个新的迁移文件。迁移文件包含了将数据库结构从上一个状态更改到当前状态所需的 SQL 语句。
2. 应用迁移: 在生成迁移文件后,migrate dev 会立即将该迁移应用到数据库中。这意味着数据库结构会更新以匹配最新的 Prisma schema。
3. 命名迁移: --name user 参数为生成的迁移文件指定一个名称。在迁移文件夹中,迁移文件会以时间戳和指定名称命名,例如 20231010123456_user,以便于识别和管理。
适用于开发环境: 该命令主要用于开发环境,以便在开发过程中快速迭代数据库模型。
增加prisma库
nest g lib prisma
修改prisma.service.ts
import { Injectable, OnModuleInit } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';
@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
constructor() {
super({
log: [
{
emit: 'stdout',
level: 'query'
},
{
emit: 'stdout',
level: 'error'
}
]
})
}
async onModuleInit() {
await this.$connect();
}
}
当模块初始化完成时连接数据库,log是打印。
redis
npm install redis --save-dev
新建一个库模块
nest g lib redis
在 redis.module.ts中 增加redis连接代码
import { Global, Module } from '@nestjs/common';
import { createClient } from 'redis';
import { RedisService } from './redis.service';
@Global()
@Module({
providers: [
RedisService,
{
provide: 'REDIS_CLIENT',
async useFactory(configService: ConfigService) {
const config = {
url: 'redis://localhost:6379',
password: 'xxx',
};
const client = createClient(config);
await client.connect();
return client;
},
},
],
exports: [RedisService],
})
export class RedisModule {}
增加redis服务
在redis.service.ts中
import { Inject, Injectable } from '@nestjs/common';
import { RedisClientType } from 'redis';
@Injectable()
export class RedisService {
@Inject('REDIS_CLIENT')
private redisClient: RedisClientType;
async keys(pattern: string) {
return await this.redisClient.keys(pattern);
}
async get(key: string) {
return await this.redisClient.get(key);
}
async set(key: string, value: string | number, ttl?: number) {
await this.redisClient.set(key, value);
if (ttl) {
await this.redisClient.expire(key, ttl);
}
}
async del(key: string) {
await this.redisClient.del(key);
}
}
当前代码地址 code