Node.js Express 框架1:路由,响应,中间件

Node.js Express 框架1:路由,响应,中间件


前言:

Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。使用 Express 可以快速地搭建一个完整功能的网站。

在学习本此内容,请先学习Node.js基础知识。


一,路由

1.路由的介绍:

路由 指确定应用程序如何响应客户端对特定终结点的请求,它是一个 URI(应用程序的端点)或路径,一个特定的 HTTP 请求方法(GETPOSTPUTDELETE 等),可以有一个或多个处理函数组成。

广义上来讲,路由就是映射关系。在Express中,路由指的是客户端的请求服务器处理函数之间的映射关系。


路由的匹配过程:

  • 每当一个请求到达服务器后,需要先经过路由的 匹配,只有匹配成功后,才会调用对应的处理函数。
  • 在匹配时,会按照路由的顺序进行匹配,如果请求类型和请求的 URL 同时匹配成功,则 Express 会将这次请求,转交给对应的 function 函数进行处理。

2.路由的使用:

路由定义采用以下结构:

app.METHOD(PATH, HENDLER)

其中:

  • appexpress 的一个实例。
  • METHOD 是小写的 HTTP 请求方法
  • PATH 是服务器上的路径。
  • HANDLER 是匹配路由时执行的函数。

使用实例:

// 引入 express 框架
const express = require("express");
// 创建网站服务器
const app = express();

// 拦截路由 
// 首页响应hello:
app.get('/', (req, res) => {
    res.send('hello!')
})
//响应根路由(/)上的 POST 请求,应用的主页:
app.post('/', (req, res) => {
    res.send('Got a POST request')
})

//监听端口:
app.listen(3000, ()=>{
    console.log('端口3000已经打开')
})

模块化路由

为了方便对路由进行模块化管理,Express不建议将路由直接挂载到app上,而是推荐将路由抽离为单独的模块。

步骤如下:

  • 创建路由模块对应的 .js 文件
  • 调用 express.Router() 函数创建路由对象
  • 向路由对象上挂载具体的路由
  • 使用 module.exports 向外共享路由对象
  • 使用 app.use() 函数注册路由模块
// 路由模块 router.js
const express = require('express');
const router = express.Router();

// 挂在具体的路由:
router.get('/home', (req, res) => {
    res.send('首页');
})

// 向外导出路由对象:
module.exports = router;



二,响应

res 对象表示 Express 应用程序在收到 HTTP 请求时发送的 HTTP 响应。

1.一般响应:

在使用 Node.js 的服务端代码中,如果使用的是 Express 框架,那么对于一个请求,常常会有两种响应方式:

// 方法1
app.get("/end", (req, res, next) =>{
    res.end(xxx);
});
// 方法2
app.get("/send", (req, res, next) =>{
    res.send(xxx);
});

两者对比:

Express 的 res.end ()res.send ()方法的相同点:

  • 二者最终都是回归到 http.ServerResponse.Useresponse.end() 方法。
  • 二者都会结束当前响应流程。

Express 的 res.end ()res.send () 方法的不同点:

前者只能发送 string 或者 Buffer 类型,后者可以发送任何类型数据。
从语义来看,前者更适合没有任何响应数据的场景,而后者更适合于存在响应数据的场景。


总结
Express 的 res.end ()res.send () 方法使用上,一般建议使用res.send() 方法即可,这样就不需要关心响应数据的格式,因为 Express 内部对数据进行了处理。


2.其他响应:

res.download()

res.json()

res.jsonp()

res.redirect()




三,中间件


1.中间件的介绍:

中间件函数是在应用的请求-响应周期中可以访问 请求对象 (req)、响应对象 (res) 和 next 函数的函数。next 函数是 Express 路由中的一个函数,当被调用时,它会在当前中间件之后执行中间件。

中间件(Middleware)本质是一个回调函数。中间件函数可以像路由回调一样访问 请求对象(request) 响应对象(respoense)


中间件的作用就是使用函数封装公共操作,简化代码。

中间件的类型:全局中间件,路由中间件。

中间件功能可以执行以下任务:

  • 执行任何代码。
  • 更改请求和响应对象。
  • 结束请求 - 响应周期。
  • 调用堆栈中的下一个中间件函数。

2.全局中间件实践:

// 记录每个请求的url 与 IP 地址
//导入 express
const express = require('express');
const fs = require('fs');
const path = require('path');

//创建应用对象
const app = express();

//声明中间件函数
function recordMiddlware(req, res, next){
    //获取url 和 ip:
    let {url, ip} = req;
    //将信息保存在access.log文件中:
    fs.appendFileSync(path.resolve(__dirname, './access.log'), `${url} ${ip}\r\n`);
    //调用 next:
    next();
};

//使用中间件函数
app.use(recordMiddlware);

//创建路由
app.get('/home', (req, res) => {
    res.send('前台首页');
});

app.all('*', (req, res)=>{
    res.send('<h1>404 not found</h1>')
})

//监听端口
app.listen(3000, ()=>{
    console.log('服务已经启动,端口3000正在监听..')
})


3.路由中间件实践:

/**  要求:::针对 /admin 的请求,
要求URL携带 code=521 参数, 如未携带提示[暗号错误]
*/

// 导入 express
const express = require('express');

// 创建应用对象
const app = express();

// 创建路由
//前台
app.get('/home', (req, res)=>{
    res.send('前台首页');
});

// 声明中间件:
let checkCodeMiddleware = (req, res, next) => {
        // 判断 URL 中 是否 code参数为521
        if (req.query.code === '521'){
            next();
        }else{
            res.send('暗号错误');
        }
}

// 后台
app.get('/admin', checkCodeMiddleware, (req, res)=>{
    res.send('后台首页')
});


//监听端口
app.listen(3000, ()=>{
    console.log('服务已经启动,端口3000正在监听..')
})

4.静态资源中间件:

补充,静态资源是什么:使用静态网页技术开发的资源(Html,CSS,JavaScript)。

特点:所有用户访问,得到的结果是一样的。如:文本,图片,音频,视频,Html,CSS,JavaScript都属于静态资源。 如果用户请求的是静态资源,那么服务器会直接将静态资源发送给浏览器。浏览器种内置了静态资源的解析引擎,可以展示静态资源。

// 导入 express
const express = require('express');

// 创建应用对象
const app = express();

// 静态资源中间件设置
app.use(express.static(__dirname + '/public'));

// 创建路由
app.get('/home', (req, res)=>{
    res.send('前台首页');
});


//监听端口
app.listen(3000, ()=>{
    console.log('服务已经启动,端口3000正在监听..')
})

注意事项:

1.index.html 文件为默认打开的资源。

2.如果静态资源与路由规则同时匹配,谁先匹配就谁响应。

3.路由响应动态资源,静态资源中间件响应静态资源。



Thanks!!

  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值