express 基本使用

Expres 基本使用

说明

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

参考

安装

    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');
    })

相关文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值