Node.js 各框架异同,与其他语言框架对比:请求上下文

主要差异点:单进程 vs 多进程

  • Egg.js —— 单进程内模拟多进程机制,实现了上下文
  • Express.js —— HTTP 库,没有进程上下文,请求数据需要通过函数层层传递
  • Koa.js —— HTTP 库,没有进程上下文,请求数据需要通过函数层层传递
  • Java:Spring —— 多进程,有进程上下文
  • PHP: Laravel —— 多进程,有进程上下文

通过代码与场景看区别

场景:在 services 中获取当前请求的请求数据(url、header ……)

Express.js & Koa.js

示例代码为 Express.js,Koa.js 在原理上与 Express.js 一致

目录结构

1
2
3
4
5
6
7
8
9
├── app.js
├── controllers
├── models
├── node_modules
├── package.json
├── public
├── routes
├── services
└── views

实现方案:通过函数参数层层传递

1
2
3
4
5
6
7
8
9
10
// /controllers/example.js
const exampleService = require('../services/example.js');

function index(req, resp, next) {
console.log(req.header);
exampleService.index(req);
return next();
}

exports.index = index;
1
2
3
4
5
6
7
8
9
// /services/example.js
const exampleService = require('../services/example.js');

function index(req, resp) {
console.log(req.header);
exampleService.index(req);
}

exports.index = index;

总结

在 Express.js 或者 Koa.js 中 app 是进程内全局唯一的实例,因为 Node.js 的单进程模式,app 相当于是整个项目的唯一实例,所以 app 上挂在的数据仅为项目数据,并不能保存每次请求进入的上下文信息。上下文信息通过 HTTP Request 实例与函数参数传递的方式在项目中流转,在 Express.js 为 req & resp,在 Koa.js 为 ctx。

Egg.js

目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
├── app
│ ├── controller
│ ├── extend
│ ├── middleware
│ ├── model
│ ├── ons
│ ├── router.js
│ └── service
├── app.js
├── bin
├── config
│ ├── config.default.js
│ └── plugin.js
├── logs
├── node_modules
├── package.json
└── README.md

实现方案:通过 Egg.js 提供的上下文对象 ctx 获取

1
2
3
4
5
6
7
8
9
10
11
// /app/controller/index.js
const { Controller } = require('egg');

class Index extends Controller {
async index() {
console.log(this.ctx.request.header);
await this.ctx.service.index.index();
}
}

module.exports = Index;
1
2
3
4
5
6
7
8
9
10
11
// /app/service/index.js
const { Service } = require('egg');

class Index extends Service {
async index() {
console.log(this.ctx.request.header);
return 'example result';
}
}

module.exports = Index;

总结

Egg.js 通过把每个 Controller、Service 定义为类的形式,在每次请求进入时都创建新的实例,并且把 ctx 注入到每个实例中这样的方式实现了请求上下文的传递。这种形式看起来非常类似于 Apache 运行 PHP 代码的多进程方式,这样的方式方便在每个请求的生命周期中获取请求上下文。

其他语言的方式

待续……

使用 C4 模型画软件架构图 2017 年度总结 & 2018 年度规划
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×