express 学习记录

来源:互联网 发布:2g 3g 4g网络区别 编辑:程序博客网 时间:2024/05/01 05:43

Expres 学习记录 - 1 - 概念

说明

Express 是一个精简的、灵活的 Node.js Web 程序框架,为构建单页、多页及混合的 Web 程序提供了一系列健壮的功能特性,可以快速的搭建一个完整功能的网站。

参考

  • Node与Express开发
  • Express 官网
  • JavaScript 标准参考教程 node.js
  • Express 4.x API

安装

    mkdir express-demo    cd express-demo    npm init    sudo npm install --save express 

简单例子

    const express = require('express');    const app = express();    // 设置端口号变量    app.set('port', process.env.PORT || 8854);    // 设置路由    app.get('/about/1', function (req, res) {        res.type('text/plain');        res.send('about page 1');    })    app.get('/about/2', function (req, res) {        res.type('text/plain');        res.send('about page 2');    })    app.get('/about/*', function (req, res) {        res.type('text/plain');        res.send('about page');    })    app.use(function (req, res) {        res.type('text/plain');        res.status(400);        res.send('400 - Not Found');    })    // 监听端口请求    app.listen(app.get('port'), function () {        console.log( 'Express started on http://localhost:' + app.get('port') + '; press Ctrl-C to terminate.' );    })

注意: req 请求,res 响应 与 Node 提供的对象一致,可以使用 req.pipe() req.on(‘data’, function() {}) 以及任何 Node 提供的方法

1. 中间件

中间件就是处理 HTTP请求的函数,最大的特点就是一个中间件处理完,再传递给下一个中间件,一个 Express 应用就是在调用各种中间件,每个中间件可以从 App 实例接受三个参数:

  1. request 对象,代表 HTTP 请求
  2. response 对象,代表 HTTP 的回应
  3. next 回调函数,代表下一个中间件,不穿参数表示调用下一个中间件,传递参数表示抛出错误,后边的中间件将不在执行

每个中间件都可以对 HTTP 请求进行加工,并且决定是否调用 next 方法,将请求传给下一个中间件

1. use 方法 注册中间件

app.use([path], function[,function ...]) 挂载中间件方法到路径上,如果路径未指定,那么默认为 ‘/’,中间件方法是顺序处理的,所以中间件包含的顺序是很重要的

    app.use('/', function (req, res, next) {        console.log(req.method + ' from ' + req.url);        next();    })    app.use('/about', function (req, res, next) {        console.log('in /about');        req.url === '/1' ? next() : res.send('sssss');    })    app.use('/about', function (req, res) {        res.send('ppp');        console.log('only /about/1 can print');    })    app.use(function (req, res) {        res.status(404);        res.send('404 Error');    })

注意: use(path) 方法中的路径,例如 /aaa 将会匹配 /aaa/aaa/1

2. 应用级中间件

应用级中间件绑定到 app 对象,使用 app.use()app.METHOD() METHOD 即为需要处理的 HTTP 请求方法

    const app = express();    // 没有挂载路径的中间件,应用的每个请求都会执行该中间件    app.use(function (req, res, next) {        console.log('Time:', Date.now());        next();    });    // 挂载至 /user/:id 的中间件,任何指向 /user/:id 的请求都会执行它    app.use('/user/:id', function (req, res, next) {        console.log('Request Type:', req.method);        next();    });    // 路由和句柄函数(中间件系统),处理指向 /user/:id 的 GET 请求    app.get('/user/:id', function (req, res, next) {        res.send('USER');    });

3. 路由级中间件

路由级中间件和应用级中间件一样,只是它绑定的对象为 express.Router()。

    const app = express();    const router = express.Router();    router.get('/', function (req, res) {        res.send('admin home page');    })    router.get('/about', function (req, res) {        res.send('admin about page');    })    // 挂载到 '/admin' 可以访问 '/admin' 和 '/admin/about'     app.use('/admin', router); 

4. 错误处理中间件

错误处理中间件有四个参数,定义时,必须使用,即使不需要使用也一定要声明,否则会将其识别为一个常规的中间件,不能处理错误

    app.use(function (err, req, res, next) {        console.log('something error');        next(err);    })    // 可以定义多个错误处理程序    app.use(function (err, req, res, next) {        console.error(err.stack);        res.status(500).send('Something broke!');        next(err);    })

5. 内置中间件

  1. express.static(root, [options]) 是目前 Express 唯一内置中间件,负责托管静态资源,参数 root 指提供静态资源的根目录
    // 可以通过 http://localhost:8854/test.txt 访问 public 目录下的文件    app.use(express.static('public'));     // 可以多次调用    app.use(express.static('public'));    app.use(express.static('files'));    // 设置虚拟目录 通过 http://localhost:8854/static/test.txt 访问文件    app.use('/static', express.static('public'));

6. 第三方中间件

通过使用第三方中间件从而为 Express 应用增加更多功能。安装所需功能的 node 模块,并在应用中加载,可以在应用级加载,也可以在路由级加载。

    // npm install --save cookie-parser    const express = require('express');    const cookieParser = require('cookie-parser');    const app = express();    // 加载用于解析 cookie 的中间件    app.use(cookieParser());

2. 路由

路由是指如何定义应用的端点(URIs)以及如何响应客户端的请求。通过 app.use() 方法,在中间件方法中可以定义基础路由,express 还提供了一些其他的接口实现路由

1. all 方法 HTTP 动词方法

Express 提供了 use 方法的一些别名,针对不同的请求

  • all 方法,表示所有指定路径的请求必须通过该中间件
  • get 方法,表示只有指定路径的 get 请求通过该中间件
  • post、put、delete 方法,与 get 方法一致,用于筛选特定的请求方式
    app.all('/a', function (req, res, next) {        res.writeHead(200, 'all');        next()    })    app.get('/a', function (req, res) {        res.end('get /a');    })    app.post('/a', function (req, res) {        res.end('post /a');    })

注意: path 部分是绝对匹配的,例:app.get('/a') 不会匹配 /a/b 这样的路径;path 部分可以使用模式匹配或者正则表达式,配置动态路由

2. route 方法创建链式路由

可以使用 app.route() 创建路由路径的链式路由句柄,之后可以在其上施加各种 HTTP 动作的中间件,这样路径在一个地方指定,有助于创建模块化的路由,

    app.route('/a/*')        .all(function (req, res, next) {            console.log(req.url);            next();        })        .get(function (req, res, next) {            console.log('get');            res.send('get something');        })        .post(function (req, res, next) {            console.log('post');            res.send('post something');        });

3. 路由句柄

以上的请求处理(路由句柄)都是一个类似中间件的回调函数,实际上路由句柄可以有多种形式,可以是一个函数、多个函数、函数数组,或者是混合

    // 单个回调函数    app.get('/a', function (req, res) {        res.end('get /a');    })    // 多个回调函数 第一个回调函数执行 next() 后第二个回调函数才会执行    app.get('/a/:id', function (req, res, next) {        res.write('first callback');        req.params.id === 'b' ? next('route') : next();     }, function (req, res) {        res.end('\ncurrent route');        })    // 如果第一个回调函数 执行的 next() 方法传入 'route' 参数,则会跳出当前路由,执行下一个路由    app.get('/a/:id', function (req, res) {        console.log('next route');        res.end('\nnext route');    })    // 回调函数数组 回调函数依次执行,知道没有 next() 调用    const cb0 = function (req, res, next) {        console.log('CB0');        next();    }    const cb1 = function (req, res, next) {        console.log('CB1');        next();    }    const cb2 = function (req, res) {        res.send('Hello from C!');    }    app.get('/a/*', [cb0, cb1, cb2]);

4. Express.Router 创建模块化、可挂载的路由句柄

通过 Express.Router() 可以创建一个‘迷你程序’,调用后返回一个路由器实例,具有操作中间件以及路由方法的能力,为不同的访问路径,指定回调函数;最后挂在到某个路径。

    const app = express();    const router = express.Router();    router.get('/', function (req, res) {        res.send('admin home page');    })    router.get('/about', function (req, res) {        res.send('admin about page');    })    // 挂载到 '/admin' 可以访问 '/admin' 和 '/admin/about'     app.use('/admin', router); 

router 实例也可以使用 route 方法创建链式路由

    router.route('/about')        .get(function (req, res) {            res.send('admin about page get');        })        .post(function (req, res) {            res.send('admin about page post');        })

router 实例也可以使用 use() 方法指定中间件,即在数据正式发送前进行处理,中间件会顺序执行,而且必须放在 HTTP 动词方法之前,否则不会执行

    router.use(function (req, res, next) {        console.log(req.url);        next();    })    router.get('/', function (req, res) {        res.send('admin home page');    })

相关文章

  • express 学习记录 - 1 - 概念
  • express 学习记录 - 2 - api
原创粉丝点击