Express的使用及原理

前言

ExpressKoa是目前最主流的基于node的web开发框架,他们的开发者是同一班人马。貌似如今Koa更加流行,缘由在于咱们能够基于Koa进行二次开发,这篇文章主要探讨一下Expressjavascript

Express的经常使用功能

  • 路由控制
  • 中间件
  • 静态文件服务
  • 模板解析

使用方法

在这里介绍一些经常使用的api:html

先引用express,而且执行java

let express = require('express');
let app = express();
app.listen(8080, () => {
    console.log(8080)
});
复制代码

1. app[method](path, function(req, res){})

根据请求路径来处理客户端发出的GET等各类请求。第一个参数path为请求的路径, 第二个参数为处理请求的回调函数。node

app.get('/', function (req, res) {
    res.end('ok');
});

复制代码

2 app.use([path,] function [, function...])

中间件就是处理HTTP请求的函数,用来完成各类特定的任务,好比检查用户是否登陆、检测用户是否有权限访问等。若是path没有写,那么默认就是"/",同时须要注意的是:中间件的执行是有顺序的 web

app.use中放入的函数称为中间件函数,通常有三个特色:express

  • 一个中间件处理完请求和响应能够把相应数据再传递给下一个中间件。
  • 回调函数的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);
});
复制代码

若是中间出错,它会直接找到错误处理中间件来进行处理。api

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)

用来设置参数,例如渲染模板bash

app.set('views', path.resolve(path.join(__dirname, 'views')));
app.set('view engine', 'html');
复制代码

6.app.engin()

规定文件用何种方式来进行渲染app

app.engine('html',html);
复制代码

Express的原理

重点说说路由功能

路由和中间件,须要有地方来保存这些信息,好比路由信息,好比中间件回调函数等等,express中有一个对象Router对象专门用来存储中间件对象,他有一个数组叫stack,保存了全部的中间件对象,而中间件对象是Layer对象。

app.use([path,] function [, function...]),

app.use([path,] function [, function...]),

app.use... 表明上图左侧的layer,而括号中的函数则表明了layer1,layer2,因此它们的执行顺序应该是一层一层执行的。

关于RouerRoute的解析:

  • Route 对象的主要做用就是建立一个路由中间件,而且建立多个方法的layer保存到本身的stack数组中
  • Router对象的主要做用就是建立一个普通中间件或者路由中间件的引导者(引导Layer对象连接到回一个route对象),而后将其保存在本身的stack数组中去。

参考资料

根据源码模拟实现express框架经常使用功能

Express工做原理和源码分析一:建立路由

相关文章
相关标签/搜索