前言
Express
和Koa
是目前最主流的基于node
的web开发框架,他们的开发者是同一班人马。貌似现在Koa
更加流行,原因在于我们可以基于Koa
进行二次开发,这篇文章主要探讨一下Express
。
Express的常用功能
- 路由控制
- 中间件
- 静态文件服务
- 模板解析
使用方法
在这里介绍一些常用的api:
先引用express,并且执行
let express = require('express');
let app = express();
app.listen(8080, () => {
console.log(8080)
});
复制代码
1. app[method](path, function(req, res){})
根据请求路径来处理客户端发出的GET等各种请求。第一个参数path为请求的路径, 第二个参数为处理请求的回调函数。
app.get('/', function (req, res) {
res.end('ok');
});
复制代码
2 app.use([path,] function [, function...])
中间件就是处理HTTP请求的函数,用来完成各种特定的任务,比如检查用户是否登录、检测用户是否有权限访问等。如果path
没有写,那么默认就是"/",同时需要注意的是:中间件的执行是有顺序的
app.use中放入的函数称为中间件函数,一般有三个特点:
- 一个中间件处理完请求和响应可以把相应数据再传递给下一个中间件。
- 回调函数的next参数,表示接受其他中间件的调用,函数体中的next(),表示将请求数据继续传递。
- 可以根据路径来区分返回执行不同的中间件。
//使用use来定义一个中间件 next也是一个函数,调用它则意味着当前的中间件执行完毕,可以继续向下执行别的中间件了
app.use(function (req, res, next) {
res.setHeader('Content-Type', 'text/html;charset=utf8');
console.log('没有路径的中间件');
//调用next的时候如果传一个任意参数就表示此函数发生了错误,
//然后express就会跳过后面所有的中间件和路由
//交给错误处理中间件来处理
next('我错了');
});
app.use('/user1', function (req, res, next) {
console.log('user1')
next()
});
app.use('/user2', function (req, res, next) {
console.log('user2')
res.end('user2');
});
//错误处理中间件有四个参数
app.use('/hello', function (err, req, res, next) {
res.end('hello ' + err);
});
复制代码
如果中间出错,它会直接找到错误处理中间件来进行处理。
4.app.param(paramName, callback)
用来批量处理路径中的参数
app.get('/username/:userid/:name', function (req, res) {
res.end(req.params.name+req.params.name);
});
app.param('userid',function(req,res,next,userid,name){
next();
})
复制代码
5. app.set(key, val)
用来设置参数,例如渲染模板
app.set('views', path.resolve(path.join(__dirname, 'views')));
app.set('view engine', 'html');
复制代码
6.app.engin()
规定文件用何种方式来进行渲染
app.engine('html',html);
复制代码
Express的原理
重点说说路由功能
路由和中间件,需要有地方来保存这些信息,比如路由信息,比如中间件回调函数等等,express中有一个对象Router对象专门用来存储中间件对象,他有一个数组叫stack,保存了所有的中间件对象,而中间件对象是Layer对象。
app.use([path,] function [, function...])
,
app.use([path,] function [, function...])
,
app.use
... 代表上图左侧的layer,而括号中的函数则代表了layer1,layer2,所以它们的执行顺序应该是一层一层执行的。
关于Rouer
和 Route
的解析:
Route
对象的主要作用就是创建一个路由中间件,并且创建多个方法的layer
保存到自己的stack
数组中Router
对象的主要作用就是创建一个普通中间件或者路由中间件的引导者(引导Layer
对象链接到回一个route
对象),然后将其保存在自己的stack
数组中去。
参考资料
根据源码模拟实现express框架常用功能
Express工作原理和源码分析一:创建路由