Node服务端开发框架

2021.5

现有框架

实践

egg.js

Egg.js 为企业级框架和应用而生,我们希望由 Egg.js 孕育出更多上层框架,帮助开发团队和开发人员降低开发和维护成本。

Egg 奉行『约定优于配置』,按照一套统一的约定进行应用开发,团队内部采用这种方式可以减少开发人员的学习成本,
# 新手指南

egg 和 koa

koa

Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。

Koa 和 Express 的设计风格非常类似,底层也都是共用的同一套 HTTP 基础库
但是有几个显著的区别,除了上面提到的默认异步解决方案之外,主要的特点还有下面几个。

1) Middleware: Koa 的中间件和 Express 不同,Koa 选择了洋葱圈模型。
2) Context: 和 Express 只有 Request 和 Response 两个对象不同,Koa 增加了一个 Context 的对象,
3) 异常处理: 通过同步方式编写异步代码带来的另外一个非常大的好处就是异常处理非常自然.使用 try catch 就可以将按照规范编写的代码中的所有错误都捕获到。只需要将这个中间件放在其他中间件之前

Egg 继承于 Koa
<!– 如上述,Koa 是一个非常优秀的框架,然而对于企业级应用来说,它还比较基础。
而 Egg 选择了 Koa 作为其基础框架,在它的模型基础上,进一步对它进行了一些增强。

扩展
在基于 Egg 的框架或者应用中,我们可以通过定义 app/extend/{application,context,request,response}.js 来扩展 Koa 中对应的四个对象的原型,通过这个功能,我们可以快速的增加更多的辅助方法,

插件 –>

# 基础功能
# 核心功能
# 教程

MyQSQL

CRUD 语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 一条数据
const post = await this.app.mysql.get('posts', { id: 12 });
// 全表
const results = await this.app.mysql.select('posts');
// 条件查询和结果定制
const results = await this.app.mysql.select('posts', { // 搜索 post 表
where: { status: 'draft', author: ['author1', 'author2'] }, // WHERE 条件
columns: ['author', 'title'], // 要查询的表字段
orders: [['created_at','desc'], ['id','desc']], // 排序方式
limit: 10, // 返回数据量
offset: 0, // 数据偏移量
});

// => SELECT `author`, `title` FROM `posts`
// WHERE `status` = 'draft' AND `author` IN('author1','author2')
// ORDER BY `created_at` DESC, `id` DESC LIMIT 0, 10;

使用事务

表达式(Literal)

内置表达式
NOW():数据库当前系统时间,通过 app.mysql.literals.now 获取。

自定义表达式
下例展示了如何调用 MySQL 内置的 CONCAT(s1, …sn) 函数,做字符串拼接。

1
2
3
4
5
6
7
8
9
10
11
12
13
await this.app.mysql.insert(table, {
create_time: this.app.mysql.literals.now,
});
// => INSERT INTO `$table`(`create_time`) VALUES(NOW())

const Literal = this.app.mysql.literals.Literal;
const first = 'James';
const last = 'Bond';
await this.app.mysql.insert(table, {
id: 123,
fullname: new Literal(`CONCAT("${first}", "${last}"`),
});
// => INSERT INTO `$table`(`id`, `fullname`) VALUES(123, CONCAT("James", "Bond"))

egg-mysql
egg-sequelize

Sequelize

RESTful API

Controller 中 this.ctx.validate() 进行参数校验,失败抛出异常。

Passport 鉴权

## 自结
express -》 koa -》egg -》 nest。
express 和 koa 都属于库,egg 是项目实践方案,提供了规范,工具等。nest 是框架,包含一套解决方案。

已实现的koa 项目和 框架egg 大抵 一致。
区分:各个控制器,包括api,user验证,参数验证方式等.

sql方式:直接在service 中写sql,也写了一层sql操作,能力偏弱。
直接在service写sql 可以借鉴;包括表达式部分。(见上面代码)

有些是没有做的,包括测试,缓存等。

nestjs

Nest 是一个用于构建高效,可扩展的 Node.js 服务器端应用程序的框架。它使用渐进式 JavaScript,内置并完全支持 TypeScript(但仍然允许开发人员使用纯 JavaScript 编写代码)并结合了 OOP(面向对象编程),FP(函数式编程)和 FRP(函数式响应编程)的元素。

在底层,Nest使用强大的 HTTP Server 框架,如 Express(默认)和 Fastify。Nest 在这些框架之上提供了一定程度的抽象,同时也将其 API 直接暴露给开发人员。这样可以轻松使用每个平台的无数第三方模块。

哲学: Nest 提供了一个开箱即用的应用程序架构,允许开发人员和团队创建高度可测试,可扩展,松散耦合且易于维护的应用程序。

技术

数据库

Nest 与数据库无关,允许您轻松地与任何 SQL 或 NoSQL 数据库集成。根据您的偏好,您有许多可用的选项。一般来说,将 Nest 连接到数据库只需为数据库加载一个适当的 Node.js 驱动程序,就像使用 Express 或 Fastify 一样。

您还可以直接使用任何通用的 Node.js 数据库集成库或 ORM ,例如 Sequelize (recipe)、knexjs (tutorial)`和 TypeORM ,以在更高的抽象级别上进行操作。

Nest 使用TypeORM是因为它是 TypeScript 中最成熟的对象关系映射器( ORM )。因为它是用 TypeScript 编写的,所以可以很好地与 Nest 框架集成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/* cats.controller.ts */

// Request
import { Controller, Get, Req } from '@nestjs/common';
import { Request } from 'express';

@Controller('cats')
export class CatsController {
@Get()
findAll(@Req() request: Request): string {
return 'This action returns all cats';
}
}

// 状态码
@Post()
@HttpCode(204)
create() {
return 'This action adds a new cat';
}
// 路由参数
@Get(':id')
findOne(@Param() params): string {
console.log(params.id);
return `This action returns a #${params.id} cat`;
}

knowledge is no pay,reward is kindness
0%