exoress的学习笔记
1、express简介
- 基于 Node.js 平台,快速、开放、极简的 Web 开发框架
官网是这样说的,地址:https://www.expressjs.com.cn/
express是基于node原生的,提供了很多中间件,功能很强大,比koa要早,也比koa靠谱。
使用:npm install express --save
;
1.1 示例
express和koa用法差不多,也都是同一个团队进行开发,只不过没类的概念,都是回调。
const app = require('express')(); // 引入express,调用,创建一个应用,类似于new koa
app.get('/', function(req, res) {
res.end('hello express!');
})
app.listen(3000); // 这个都一样
// 运行, 浏览器访问localhost 3000 hello express!
可以看出来express和原生node差不多,只不过express的路由内置了,毕竟写node肯定要用到路由嘛,直接访问get
or post
就可以了。
1.2 express和koa差异
- koa使用的ES6,express使用的ES5
- koa基于promise,express基于回调
- express内置了很多中间件,比如路由、静态服务、模板引擎,koa只有核心的use方法,其他需要安装依赖
- koa的基于
req,res
进行封装了自己的req,res
,express是直接对原生的进行扩展
2、路由系统
express可以实现如下所示功能:
app.get('/', function(req, res, next) {
console.log('1');
next();
})
app.get('/', function(req, res, next) {
console.log('2');
next();
})
app.get('/', function(req, res, next) {
console.log('3');
next();
})
app.get('/', function(req, res) {
console.log('4');
res.end('ok');
})
// => 1 2 3 4
这个就和koa的中间件很相似了,而且这个也有next
方法,功能也差不多,只不过这个不是一个promise
,koa的next()本身是一个promise。
还可以传入多个函数执行,会串行执行
app.get('/', function(req, res, next) {
console.log('11');
next();
}, function(req, res, next) {
console.log('111');
next();
}, function(req, res, next) {
console.log('1111');
next();
})
app.get('/', function(req, res) {
console.log('22');
res.end('ok');
})
// 11 111 1111 22
3、中间件
中间件:可以决定是否向下执行,可以扩展属性和方法,可以权限校验,中间件放置在路由前面并且中间件没有方法。
koa都有中间件express肯定有了,express和koa的中间件有些许差异,express还支持带路径匹配的, 第一个参数如果不传就默认/
,为/
的话默认任何路径都会匹配,进行验证
const express = require('express');
const app = express();
// 判断传入的是不是 ?a=1 如果是的话就执行路由回调,没有就执行 res.send('没有权限');
app.use('/', (req, res, next) => {
if (req.query.a == 1) {
next();
} else {
res.send('没有权限');
}
})
app.get('/', function(req, res) {
res.send('有权限,通过了');
})
app.listen(3000, () => {
console.log('running')
})
出错误了就传递给next()
,默认错误信息传递给next()
;
app.use((req, res, next) => {
console.log(222)
next('出错了');
})
app.get('/', function(req, res) {
res.end('ok');
})
直接走出错了
,并不会往下继续走
4、简版实现原理
./express/index.js
// index.js就负责入口
module.exports = require('./lib/express')
./express/lib/express.js
主代码
const http = require('http');
const url = require('url');
const routers = [{
page: '*',
method: 'all',
handler: function(req, res) {
res.end(`Cannot ${req.method} ${req.url}`);
}
}]
function createApplication() {
return {
get(path, handler) {
routers.push({
path: path,
method: 'get',
handler: handler
})
},
listen(port) {
const server = http.createServer((req, res) => {
let { pathname } = url.parse(req.url);
let requestMethod = req.method.toLowerCase();
for (let i = 0; i < routers.length; i++) {
let { path, method, handler } = routers[i];
if (path == pathname && method == requestMethod) {
return handler(req, res);
}
}
return routers[0].handler(req, res);
})
server.listen(...arguments);
}
}
}
module.exports = createApplication;
完整版在https://github.com/LB-nan/expressDemo