express

2020/03/19 node

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

Search

    Table of Contents