发布于 2026-01-06 7 阅读
0

你唯一应该使用的 API 堆栈(和工作流程)。

你唯一应该使用的 API 堆栈(和工作流程)。

多年来,我尝试过多种 Node.js 后端技术栈,现在终于找到了一个合适的,它可以帮助您快速开发项目(并启动您的创业项目!)。

REST框架

为什么?我广泛使用过 REST 和 GraphQL 后端,我认为在大多数情况下,GraphQL 有点过度设计了。虽然它在可扩展性方面表现出色,但对于项目而言,它并不是开发 API 的最快方式。

我选择的 REST 框架是koa.js。为什么
呢?我认为它是快速开发 API 的最佳框架之一,因为它能让你非常轻松地从构思到实现。

中间件栈也非常直观,并且依赖于 async/await。

我觉得它比Express好得多,而且通常也更轻便。

TypeScript

为什么?因为它是一种极其有效且简便的方法,可以确保 API 类型的安全性,并能从长远来看加快开发速度。它为我省去了很多麻烦,而且它的智能感知建议功能也让我受益匪浅。

你还会发现,使用 TypeScript 可以让我们轻松地将其集成TypeORM到我们的项目中。

ESLint

为什么?保持一致性至关重要。ESLint 可以确保你和你的同事不会因为代码格式不正确而互相指责。它还可以跟踪未使用的变量/导入以及使用 `<input type="text/html">`let而不是 `<input type="html">` 等问题const

数据库

这取决于你的具体使用场景。不过,你只需要关注两种数据库类型——关系型数据库和文档型数据库。

如果你不确定,
我建议小型项目可以使用文档型数据库,例如 MongoDB。
但是,随着项目规模的扩大,实体之间可能会建立一定的关联。这时,就应该使用关系型数据库,例如 MySQL 或 PostgreSQL(我个人更倾向于使用 PostgreSQL)。

TypeORM

对于 MongoDB 来说,Mongoose 可能更合适。
为什么呢? TypeORM 是一个用于 TypeScript(以及 Babel)的对象关系映射库,这意味着你无需处理原始 SQL,并且可以使用一些实用工具,例如自动关系连接。

TypeORM之所以如此引人注目,是因为它使用装饰器进行实体同步。这意味着你无需在开发环境中使用迁移。

相反,你可以定义一个类并对其进行修饰:

@Entity()
class User {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  // automatic type detection thanks to reflection!
  @Column()
  name: string;

  // automatic date columns!
  @CreateDateColumn()
  createdAt: Date;
}
Enter fullscreen mode Exit fullscreen mode

TypeORM 然后使用该类来迁移数据库,并根据字段提供 IntelliSense 建议。

为什么不呢?坦白说,TypeORM 对新手并不友好,主要是因为它的文档写得实在糟糕。但是,一旦你掌握了它的使用方法,并能充分利用 IntelliSense,它就会成为一个极其强大的工具。

Git 流

为什么?这是一种特定的理念/工作流程/策略,在团队协作中使用 Git 时尤其有效(如果你不是团队成员,则并非特别需要)。
它定义了哪些分支应该用于特定用途,例如功能开发、版本发布和紧急修复。

.env

为什么?现在使用.env文件来定义环境变量几乎已成为一种标准做法。这样可以让你为本地计算机和托管项目所在的计算机定义不同的变量。

别忘了.env添加.gitignore

文件结构

我设计了一种与这套技术栈非常契合的文件结构:

src
├── entities
│   └── User.ts
├── modules
│   └── module-name
│       ├── module-name.router.ts
│       ├── module-name.service.ts
│       └── module-name.spec.ts
├── mw
├── utils
└── app.ts

e2e
└── test-name.e2e.ts
Enter fullscreen mode Exit fullscreen mode

从上往下看:

  • entities文件夹用于存储您的 TypeORM 实体。
  • modules文件夹存放着应用程序的不同模块(灵感来自 NestJS)。例如,一个auth模块可能包含一个路由器,该路由器又包含一条/auth/facebook路由,这条路由会调用authorizeWithFacebook()服务文件中的函数。重要的是,路由器负责处理 HTTP 请求,而服务只处理纯数据。这样,你的单元测试.spec.ts就可以直接调用服务。此外,大多数情况下,你的路由应该以模块名称为前缀。
  • mw文件夹用于存放您的自定义中间件。您也可以使用utils该文件夹。
  • 这个utils文件夹几乎包含了所有其他不适合放在其他地方的功能。
  • e2e文件夹存储端到端测试。

事实证明,这种工作流程在我的项目中最为成功,非常适合快速开发。

不同意我的观点?欢迎在评论区展开讨论!

祝你编程愉快!🎉

文章来源:https://dev.to/judehunter/the-only-api-stack-and-workflow-you-should-be-using-10o8