Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/small-tou/nestjs-prisma-example
around nestjs, with prisma and some graphql lib,write less code,create power api
https://github.com/small-tou/nestjs-prisma-example
graphql nestjs prisma swagger
Last synced: 7 days ago
JSON representation
around nestjs, with prisma and some graphql lib,write less code,create power api
- Host: GitHub
- URL: https://github.com/small-tou/nestjs-prisma-example
- Owner: small-tou
- Created: 2021-12-23T01:54:24.000Z (almost 3 years ago)
- Default Branch: master
- Last Pushed: 2021-12-23T08:55:29.000Z (almost 3 years ago)
- Last Synced: 2024-04-15T02:48:54.276Z (7 months ago)
- Topics: graphql, nestjs, prisma, swagger
- Language: TypeScript
- Homepage:
- Size: 2.37 MB
- Stars: 29
- Watchers: 2
- Forks: 6
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
## 介绍
这是一个 prisma + nestjs + graphql 的集成示例
对于开发者来说,特别是使用 graphql 的时候,只需要写非常少量的代码即可完成数据的各种操作,同时也支持接口透传。
### 开发&部署
#### 本地开发
npm run start:dev
swagger 地址:http://localhost:3001/swagger
graphql playground:http://localhost:3001/index.html
### 核心能力
#### 1. prisma 集成
- prisma 接管数据模型定义
- prisma 提供 orm 数据操作
- prisma 提供数据订正和管理#### 2. graphql 集成
- prisma-nestjs-graphql 提供 prisma 数据模型到 graphql 类型的转换
- 使用 nestjs 内置的代码优先模式,使用生成的类型提供 graphql 模型
- 使用 graphql 模型 + orm,自动通过 resolver 提供给前端访问接口
- 此方案中,普通和高级的增删改查基本不需要自己增加代码#### 3. restful api proxy
- 通过 swagger-to-graphql 将 openapi 接口通过 oas 文档直接转换为 graphql 定义
- 通过 graphqlHTTP 将请求代理到 restful 接口
- 此方案中,swagger 的描述无缝转换到 graphql 描述,并自动代理请求#### 4. nestjs 本身一些特性的示例
- 全局钩子,并且兼容 graphql 和 rest 请求,如 登录校验、返回封装、错误处理等
- graphql 集成和配置,graphql 代理集成和配置
- yaml 配置和加载#### 5. graphiql-explorer 快速组合查询
- 通过 graphiQL 的第三方插件 graphiql-explorer 快速预览和组合 graphql 请求
![](./F0698852-0F7F-4C35-88F5-E2BA76E47B09.png)
更多信息:[](./share.md)
### 开发流程
#### 1. 首先定义业务模型(prisma scheme)
修改 ./prisma/scheme.prisma
添加新的业务模型
```
model xxx {
id Int @id @default(autoincrement())
uid String @unique @default(uuid())
name String @unique @db.VarChar(20)
}
```#### 2. 创建数据库表
可以使用 prisma cli 创建表结构,不过为了安全起见,最好使用本地数据库操作,然后将数据库的 create sql 同步至其他环境
#### 3. prisma orm sdk 生成
`npm run gen`
之后即可在代码中使用 prisma 的对象
```javascript
this.prisma.tag.findMany({
skip: (pager.pageIndex - 1) * pager.pageSize,
take: pager.pageSize,
where: {
is_delete: false,
},
orderBy: [{ use_count: 'desc' }],
select: {
is_delete: false,
id: false,
uid: true,
name: true,
use_count: true,
created_at: true,
updated_at: true,
},
});
```#### 4. 创建 crud 接口
`npm run crud`
生成新的业务模型的增伤改查接口,可以选择生成 rest 接口或者 graphql 接口(代码优先)
#### 5. 开发业务逻辑(rest)
修改接口定义 xxx.controller.ts
修改 service 实现:xxx.service.ts
定义 swagger 注解
#### 5. 开发业务逻辑(graphql)
在运行 npm run gen 的过程中,会使用 prisma-nestjs-graphql 生成 gql 类型定义
在 xxx.resolver.ts 中开发逻辑
在使用 gen 生成 gql 的类型代码之后,基本不需要写太多 service 逻辑,特别是普通的单个和列表查询
如:
```
import { FindManytagArgs } from '../@generated/tag/find-manytag.args';
import { FindUniquetagArgs } from '../@generated/tag/find-uniquetag.args';
import { tagWhereInput } from '../@generated/tag/tag-where.input';
import { tagCreateInput } from '../@generated/tag/tag-create.input';
import { tag } from '../@generated/tag/tag.model';
import { tag_event_relation } from '../@generated/tag-event-relation/tag-event-relation.model';...
@Query(() => [tag], { name: 'tagsAll' })
async findAll(@Args() args: FindManytagArgs) {
const result = await this.tagsGqlService.findMany({ ...args });
return result;
}
```FindManytagArgs 是 生成的类型
this.tagsGqlService.findMany 就是一个透传,内部是 this.prisma.tag.findMany
```
@Injectable()
export class TagsGqlService {
constructor(private prisma: PrismaService) {}update = this.prisma.tag.update;
delete = this.prisma.tag.delete;
findUnique = this.prisma.tag.findUnique;
findMany = this.prisma.tag.findMany;
count = this.prisma.tag.count;
create = this.prisma.tag.create;
}```
![](./5C44E121-4090-4C9B-8197-30771B9F9671.png)
#### 6. 查看 swagger 和 graphql playground
swagger 地址:http://localhost:3000/swagger
graphql playground:http://localhost:3000/index.html