禅意coder 禅意coder
首页
  • 跟我一起学NodeJs
  • JavaScript 异步编程
  • kafka 相关知识
  • 分类
  • 标签
  • 归档
关于
GitHub
首页
  • 跟我一起学NodeJs
  • JavaScript 异步编程
  • kafka 相关知识
  • 分类
  • 标签
  • 归档
关于
GitHub
  • 一起学nodejs

    • 一起学nodejs(基本概念)
    • 一起学nodejs(微型文件系统实现)
    • 一起学nodejs(Buffer)
    • 一起学nodejs(写一个基于TCP/IP终端聊天系统)
    • nodejs_connect
      • 中间件(middleware)的概念
      • connect
        • 如何编写一个中间件
      • 参考链接
  • javascript 异步编程

  • kafka知识

  • linux的奥义

  • java语言

  • 系列文章
  • 一起学nodejs
liushaoqing
2021-01-15

nodejs_connect

# 一起学nodejs(connect)

# 中间件(middleware)的概念

后端的中间件的概念常常指与业务无关的将业务和底层解耦的组件,比如后端常说的消息中间件 kafka,'rabbitmq'. 在前端目前最为常见的在处理http请求的过程的组件,比如我们要介绍的connect.js, 后来的nodejs 框架 expressjs(expressjs3.* 依然是connectjs的封装),koa 等都借鉴了中间件的实现,最开始在angularjs1.x的时候,第一次看到$http模块拦截器的实现也是这种模式.其实这概念没有严格的定义,感觉这里应该叫做插件比较合适.

# connect

connnect 是一个基于HTTP服务的工具集,它的核心功能就是提供了一种中间件的代码组织方式来与请求和响应做交互. 下面是connnect最常见的使用方式,github上有大量的中间件 简化http处理的过程

var connect = require('connect');
var http = require('http');

var app = connect();

// gzip/deflate outgoing responses
var compression = require('compression');
app.use(compression());

// store session state in browser cookie
var cookieSession = require('cookie-session');
app.use(cookieSession({
    keys: ['secret1', 'secret2']
}));

// parse urlencoded request bodies into req.body
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extended: false}));

// respond to all requests
app.use(function(req, res){
  res.end('Hello from Connect!\n');
});

//create node.js http server and listen on port
http.createServer(app).listen(3000);
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

# 如何编写一个中间件

connect 的api非常少,一个use() 一个listen(),use方法用来添加中间件,listen则调用http模块的方法 http.creatServer().listen();

# 使用静态文件服务中间件,下面两种写法相同

写法1:

var connect = require('connect');
var serveStatic = require('serve-static');

var app = connect();
app.use(serveStatic(__dirname,{'index': ['index.html', 'index.htm']}));
app.listen(3000);
1
2
3
4
5
6

写法2:

var connect = require('connect');
var http = require('http');
var serveStatic = require('serve-static');

var app = connect();
app.use(serveStatic(__dirname,{'index': ['index.html', 'index.htm']}));
http.createServer(app).listen(3000);
1
2
3
4
5
6
7

# 中间件的执行顺序

添加了三个中间件,按照添加顺序依次执行,每个中间件的next对应下一个中间件,那么第三个middleWare执行next的时候对应哪个中间件呢? 每次添加next()防止还有其他中间件,如果没有的话,则中间件链中断.实际上第三个middleWares中的next()和没执行效果是相同的 如果去掉middleWare2中的next() 调用,输出结果则是12success

var connect = require('connect');

var app = connect();
app.use(middleWare1)
app.use(middleWare2)
app.use(middleWare3)
app.listen(3000);

function middleWare1(req,res,next){
  res.write('1')
  next();
  res.end('success');
}

function middleWare2(req,res,next){
  res.write('2')
  next();
}

function middleWare3(req,res,next){
  res.write('3')
  next();
}
// 页面输出123success
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 模拟一下自己实现一个connect,只实现核心功能


1

# 参考链接

  • connect
  • 中间件是什么?如何解释比较通俗易懂
  • connect-middleware
编辑
#前端#nodejs
上次更新: 2021/01/23, 09:10:58
一起学nodejs(写一个基于TCP/IP终端聊天系统)
javascript 异步编程-1.深入理解javascript事件

← 一起学nodejs(写一个基于TCP/IP终端聊天系统) javascript 异步编程-1.深入理解javascript事件→

最近更新
01
轮子哥编程的感悟(转载)
01-23
02
tmux 配置和使用
01-23
03
命令行日常使用配置
01-15
更多文章>
Theme by Vdoing | Copyright © 2020-2021 刘少卿 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×