我尝试使用TypeScript+NestJS+Prisma来创建了一个GraphQL服务器
首先
最近几年,前端驱动的开发变得非常流行,我们经常能看到一些关于使用TypeScript来实现后端处理的文章和动态。还出现了像“微前端”这样的词汇。
在GoQSystem中,我们也一直进行着新技术的信息收集和学习。虽然我是后端工程师,但在考虑整个系统架构时,我也始终进行着前端技术的信息收集和学习。
这次我将使用Prisma在GitHub仓库中提供的示例来创建一个GraphQL服务器。
应用技术
-
- TypeScript
-
- NestJS
-
- Prisma
- GraphQL
NestJS是什么?
这是一个用于构建高效、可靠、可扩展的服务器端应用程序的渐进式Node.js框架。
Prisma是什么
这是一个开源的对象关系映射(ORM)工具。
GraphQL是一种查询语言。
GraphQL是由查询语言和模式语言组成的Web API规范。GraphQL是由Facebook公司在2012年开始开发,并在2015年开源化。
开发环境
假设已安装了node和npm。
マシン:MacBook Pro (13インチ, 2020)(Apple M1, メモリ16GBモデル)
OS:macOS Ventura 13.0.1
npm -v
8.19.2
node -v
v18.12.1
例子的使用
创建GraphQL服务器
1. 下載示例並安裝npm相依關係。
我会按照README文档的指示,使用以下命令下载Example仓库。
npx try-prisma --template typescript/graphql-nestjs
由于会要求您选择是否自动安装软件包,所以此次选择”是”,并让它自动安装。
? Should we automatically install packages for you? y
因此,我们需要选择要使用的软件包管理器,所以选择npm。然后按下Enter继续。
? Which package manager do you prefer? (Use arrow keys)
❯ npm
yarn
pnpm
接下来会被问到项目的名称,请输入。这次我们将使用nestjs-prisma-graphql作为名称。
? What should the project be named? nestjs-prisma-graphql
在最后,您将被问及要创建文件夹的位置,请输入一个合适的路径。这次我们将使用“.”作为路径。
? Where should the new folder be created? .
运行 npx try-prisma –template typescript/graphql-nestjs
✔ 已加载 40 个模板
? 是否要为您自动安装包?是
? 您更喜欢哪个包管理器?npm
? 项目应该被命名为什么?nestjs-prisma-graphql
? 新文件夹应该创建在哪里?.
✔ 已下载并提取了 typescript/graphql-nestjs 项目。
✔ 已安装包。项目已经准备就绪!下一步:
1. 进入项目目录:
cd ./nestjs-prisma-graphql
2. 基于 `schema.prisma` 创建并执行初始迁移:
npx prisma migrate dev
有关此项目的更多信息,请访问:
https://github.com/prisma/prisma-examples/tree/latest/typescript/graphql-nestjs
如果对这个特定模板有任何反馈,我们想要听到!
请在此处提交任何反馈:https://pris.ly/prisma-examples-feedback
2. 创建和填充数据库
执行以下命令将创建SQLite并创建User和Post表。
cd ./nestjs-prisma-graphql
npx prisma migrate dev --name init
正在执行此命令,对数据库和表创建文件prisma/schema.prisma以及种子执行文件prisma/seed.ts进行操作。
这次是关于Prisma的示例,所以我使用了Prisma作为ORM,但我也尝试了使用TypeORM。
我认为TypeORM是NestJS的默认选择吧?但是0.2版本和0.3版本之间的更改是破坏性的,相关信息很少,让我有些困扰。个人而言,我觉得Prisma更易用一些(尤其是配置文件和迁移相关)。
npx prisma migrate dev –name init
从 prisma/schema.prisma 加载 Prisma schema
数据源 “db”:SQLite 数据库 “dev.db” 位于 “file:./dev.db” 上SQLite 数据库 dev.db 已在文件夹 ./dev.db 中创建
应用迁移 `20230115152921_init`
下列迁移已从新的模式更改中创建并应用:
迁移/
└─ 20230115152921_init/
└─ migration.sql
现在,您的数据库与模式同步。
✔ 在 194ms 内生成了 Prisma Client (4.8.1 | library) 到 ./node_modules/@prisma/client
正在运行种子命令 `ts-node prisma/seed.ts` …
开始种子填充 …
已创建具有id 1的用户
已创建具有id 2的用户
已创建具有id 3的用户
种子填充完成。
? 种子命令已执行。
3. 启动GraphQL服务器
用以下的命令来启动NestJS。
npm run dev
在终端上显示以下类型的日志:
npm run dev
...
? Server ready at: http://localhost:3000/graphql
⭐️ See sample queries: http://pris.ly/e/ts/graphql-nestjs#using-the-graphql-api
试着使用GraphQL获取数据
我們將使用 GraphQL Playground 來擷取資料。
請透過 http://localhost:3000/graphql 連線,並使用以下查詢來取得文章和對應作者的資料。
query {
feed {
id
title
content
published
author {
id
name
email
}
}
}
请一定试试在Example仓库中还有其他数据生成(mutation)和创建新模型(Prisma)的方法。
当我们查看package.json文件时,就能明白GraphQL的实现使用了Apollo(在src/app.module.ts中导入了ApolloDriver)。
@Module({
imports: [
GraphQLModule.forRoot<ApolloDriverConfig>({
driver: ApolloDriver,
autoSchemaFile: join(process.cwd(), 'src/schema.gql'),
buildSchemaOptions: { dateScalarMode: 'timestamp' },
}),
],
controllers: [],
providers: [PrismaService, UserResolver, PostResolver],
})
而且,GraphQL的Schema定义在src/schema.gql文件中进行。
思考
这次不介绍,但我尝试了很多事情,比如从零开始安装NestJS并使用默认功能创建REST API,使用Docker构建和使用PostgreSQL或MySQL而不是SQLite,使用TypeORM,并尝试建立tRPC服务器,而不使用Example。
我认为这项技术非常吸引人,因为它可以通过简单的描述内容轻松创建API服务器。如果在AWS CDK中使用TypeScript,您可以使用TypeScript实现前端+后端+基础设施的全部功能。
正如上述所述,tRPC服务器也可以非常容易地创建。使用这些技术,可以轻松创建REST API或GraphQL环境,这非常具有吸引力。
只是在开发强大的后端API时,我会思考是否故意选择NestJS框架。当我希望处理更复杂的逻辑和架构,或者考虑到后续的扩展时,这个问题尤为重要。
然而,如果考虑团队开发和维护,能够使用前端工程师熟悉的语言来构建后端处理逻辑确实很有吸引力。考虑到组织或团队可能存在后端工程师不足的情况,选择NestJS框架可能有其原因。
作为前端工程师来说,如果要轻松构建应用程序的话,我认为可能会选择T3 Stack,或是使用SvelteKit或Supabase(或Firebase)。
虽然需要仔细考虑使用方式,但我也希望能在某个地方采用它。无论如何,尝试接触我不熟悉的技术(TypeScript)让我的见识扩展了,也感到很有乐趣。
最后
GoQSystem正在招募一起工作的伙伴!
我們目前沒有求人,但我們打算未來招募SRE和QA工程師!如果您有興趣,請通過以下鏈接進行查閱。