当前位置: 首页 > article >正文

实现一个专注应用-后端开发(一)-搭建

搭建后端服务

  • 搭建服务
    • 拆分下用户服务
  • 增加公共库
    • 通用模块
  • 运行一下
  • 接入数据库
    • 安装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


http://www.kler.cn/a/554104.html

相关文章:

  • QML Image 圆角设置
  • 从猜想终结到算法革新,弹性哈希开启数据存储新篇章
  • docker run --ipc=host参数含义
  • UniApp 面试题 超基础
  • C++效率掌握之STL库:vector函数全解
  • ubuntu 创建交换分区 或者扩容交换分区
  • 鸿蒙中,UIAbility组件启动模式(3种分别是Singleton(单实例模式)Multiton(多实例模式)Specified(指定实例模式))
  • Python常见面试题的详解13
  • 解决 Nginx 代理后 HTTP 头部丢失的问题:以 access_token 为例
  • 【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析⑤】
  • rust学习五、认识所有权
  • unity学习47:寻路和导航,unity2022后版本如何使用 Navmesh 和 bake
  • 图解MySQL【日志】——Buffer Pool
  • Java Applet 学习笔记(详细版)
  • Redis 过期键(expires)机制详解
  • Linux 内存管理与文件页缓冲区
  • 【二分搜索 C/C++】洛谷 P1873 EKO / 砍树
  • Redis7——基础篇(二)
  • 前端504错误分析
  • leetcode-414.第三大的数