搭建后端服務
- 搭建服務
- 拆分下用戶服務
- 增加公共庫
- 通用模塊
- 運行一下
- 接入數據庫
- 安裝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 @uniqueemail String? @uniquewxId String? @uniquecreatedAt 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