- 创建项目
- Nest 控制器
- nest 配置路由请求数据
- Nest 服务
- Nest 模块
- 配置静态资源
- 配置模板引擎
- Cookie 的使用
- Session 的使用
- 跨域,前缀路径、网站安全、请求限速
- 管道、守卫、拦截器、过滤器、中间件
- 一例看懂中间件、守卫、管道、异常过滤器、拦截器
- 数据验证
- 配置抽离
- 环境配置
- 文件上传与下载
- 实现图片随机验证码
- 邮件服务
- nest 基于 possport + jwt 做登陆验证
- 对数据库的密码加密:md5 和 bcryptjs
- 角色权限
- 定时任务
- 接入 Swagger 接口文档
- nest 连接 Mongodb
- typeORM 操作 Mysql 数据库
- nest 统一处理数据库操作的查询结果
- 数据库实体设计与操作
- typeorm 增删改查操作
- typeorm 使用事务的 3 种方式
- typeorm 一对一关系设计与增删改查
- typeorm 一对多和多对一关系设计与增删改查
- typeorm 多对多关系设计与增删改查
- nest 连接 Redis
- 集成 redis 实现单点登录
- Q:nestJS 注入其他依赖时为什么还需要导入其 module
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
Nest 服务
Nestjs 中的服务可以是 service
也可以是 provider
。他们都可以 通过 constructor 注入依赖关系
。服务本质上就是通过 @Injectable()
装饰器注解的类。在 Nestjs 中服务相当于 MVC
的 Model
创建服务
nest g service posts
创建好服务后就可以在服务中定义对应的方法
import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository, Not, Between, Equal, Like, In } from 'typeorm'; import * as dayjs from 'dayjs'; import { CreatePostDto } from './dto/create-post.dto'; import { UpdatePostDto } from './dto/update-post.dto'; import { PostsEntity } from './entities/post.entity'; import { PostsRo } from './interfaces/posts.interface'; @Injectable() export class PostsService { constructor( @InjectRepository(PostsEntity) private readonly postsRepository: Repository<PostsEntity>, ) {} async create(post: CreatePostDto) { const { title } = post; const doc = await this.postsRepository.findOne({ where: { title } }); console.log('doc', doc); if (doc) { throw new HttpException('文章标题已存在', HttpStatus.BAD_REQUEST); } return { data: await this.postsRepository.save(post), message: '创建成功', }; } // 分页查询列表 async findAll(query = {} as any) { let { pageSize, pageNum, orderBy, sort, ...params } = query; orderBy = query.orderBy || 'create_time'; sort = query.sort || 'DESC'; pageSize = Number(query.pageSize || 10); pageNum = Number(query.pageNum || 1); console.log('query', query); const queryParams = {} as any; Object.keys(params).forEach((key) => { if (params[key]) { queryParams[key] = Like(`%${params[key]}%`); // 所有字段支持模糊查询、%%之间不能有空格 } }); const qb = await this.postsRepository.createQueryBuilder('post'); // qb.where({ status: In([2, 3]) }); qb.where(queryParams); // qb.select(['post.title', 'post.content']); // 查询部分字段返回 qb.orderBy(`post.${orderBy}`, sort); qb.skip(pageSize * (pageNum - 1)); qb.take(pageSize); return { list: await qb.getMany(), totalNum: await qb.getCount(), // 按条件查询的数量 total: await this.postsRepository.count(), // 总的数量 pageSize, pageNum, }; } // 根据 ID 查询详情 async findById(id: string): Promise<PostsEntity> { return await this.postsRepository.findOne({ where: { id } }); } // 更新 async update(id: string, updatePostDto: UpdatePostDto) { const existRecord = await this.postsRepository.findOne({ where: { id } }); if (!existRecord) { throw new HttpException(`id 为${id}的文章不存在`, HttpStatus.BAD_REQUEST); } // updatePostDto 覆盖 existRecord 合并,可以更新单个字段 const updatePost = this.postsRepository.merge(existRecord, { ...updatePostDto, update_time: dayjs().format('YYYY-MM-DD HH:mm:ss'), }); return { data: await this.postsRepository.save(updatePost), message: '更新成功', }; } // 删除 async remove(id: string) { const existPost = await this.postsRepository.findOne({ where: { id } }); if (!existPost) { throw new HttpException(`文章 ID ${id} 不存在`, HttpStatus.BAD_REQUEST); } await this.postsRepository.remove(existPost); return { data: { id }, message: '删除成功', }; } }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论