当前位置:首页 > 技术分析 > 正文内容

express.js 应用-路由与路由中间件

ruisui881个月前 (03-24)技术分析4

在定义HTTP请求的监听处理函数或请求处理中间件时,针对每个请求我们需要调用相应的代码块。根据用户请求路径和请求方式的不同,需要触发不同的服务器形为,如:GET请求和POST请求应该区别处理、不同的URL也应该有不同的响应。 在Express应用中,通过路由实现不同请求路径和请求方式的触发不同的服务器响应。

  1. Express中的路由

  2. 路由处理

  3. 路由中间件

  • 3.1 添加通用中间件

  • 3.2 添加单个中间件

  • 3.3 中间件的组合

1. Express中的路由

Express 应用中,在app.js中引入路由处理:

app.use('/', routes); // 主页

app.use('/users', users);// 用户

在上面示例中,引入了两个路由处理文件。分别用于处理主页显示,和显示用户列表。两个路路文件代码分别如下。

主页文件routes/index.js

/* GET 请求主页 */

router.get('/', function(req, res) {

res.render('index', { title: 'Express' });

});

GET访问/路径时,则调用routes/index.js中的方法处理。

用户相关处理文件routes/users.js

/* GET 请求用户列表 */

router.get('/', function(req, res) {

res.send('响应请求资源');

});

GET访问/users路径时,高调用routes/users.js中的方法处理。

2. 路由处理

在实际应用中,我们需要对应用功能进行扩展。如,在用户模块中,可能会需要以下功能:

  • GET请求/users,返回用户列表

  • GET请求/users/:username,返回指定用户的用户信息

  • POST请求/users,创建新用户

  • PUT请求/users/:username,按用户名更新用户信息

实现这些功能,要将routes/users.js文件修改如下:

/* GET 请求,查询用户列表 */

router.get('/', function(req, res) {

/* 查询用户列表的操作 */

res.send('响应查询的用户列表');

});

/* GET 请求,按用户名获取用户信息 */

router.get('/:username', function(req, res) {

/* 查询用户信息处理 */

res.send('响应指定用户名的用户信息');

});

/* POST 请求,创建用户信息 */

router.post('/', function(req, res) {

/* 创建用户的操作 */

res.send('响应创建用户的结果');

});

/* PUT 请求,按用户名更新用户信息 */

router.put('/:username', function(req, res) {

/* 更新用户信息处理 */

res.send('响应更新用户信息的操作结果');

});

app.js中,通过app.use('/users', users)设置的模块路径,所以模块中的路相当于:/users+下级路径,如,更新用户信息的路径/:username的实际路径是/users/:username

3. 路由中间件

在上一篇Express的介绍(Express.js 应用-中间件的使用)中,通过在app.js添加中间件实现了一些如:数据解析、通用处理等操作。在路由中同样可以添加中件间,与app.js中添加的中间件不同,路由中添加的中间是针对一个或一类请求的处理。

3.1 添加通用中间件

对所有用户模块中的所有类型的请求添加一个检查用户是否登录的中间件:

/* 所有请求,检查用户是否登录中间件 */

router.all('/*', _checkUserLogin, function(req, res) {

// 可以访问上一个中间件中添加的信息

console.log(res.locals.user);

next();

});

function _checkUserLogin(req, res, next) {

/* 用户登录的检查 */

if(/* 用户已登录 */) {

// 将已登录的用户添加至res.locals中,这样可能

res.locals.user = user;

}

// 通过next回调进入下一步处理

next();

}

3.2 添加单个中间件

也可以对某一个路由添加单独的中间件,在用户信息前,一般需要首先检查用户是否存在:

/* PUT 请求,按用户名更新用户信息 */

router.put('/:username', _checkUser, function(req, res, next) {

/* 更新用户信息处理 */

if(res.locals.user) {

/* 更新用户信息 */

} else {

/* 用户不存在时 */

// 可以通过next,传递404状态

next(404);

// 或直接提示用户不存在

res.send('修改用户不存在');

}

});

function _checkUser(req, res, next) {

/* 检查用户是否存在 */

if(/* 如查用户存在 */) {

res.locals.user = user;

}

next()

}

3.3 中间件的组合

中间件可以不止一个,当某一个或一类操作需要多种中间处理时,这时可以添加一组中间件。添加多个中间件是,可以依次添加或是以数组的形式添加:

/* PUT 请求,按用户名更新用户信息 */

// 依次添加处理中间件

// router.put('/:username', _checkUser, _checkUsername, function(req, res, next) {

// 以数组的形式添加处理中间件

router.put('/:username', [_checkUser, _checkUsername], function(req, res, next) {

/* 更新用户信息处理 */

if(res.locals.user) {

/* 更新用户信息 */

if(req.username){

/* 更新用户名可用时的处理 */

} else {

/* 更新用户名不可用时的处理 */

}

} else {

/* 用户不存在时的处理 */

}

});

// 检查用户是否存在

function _checkUser(req, res, next) {

/* 检查用户是否存在 */

if(/* 如查用户存在 */) {

res.locals.user = user;

}

next()

}

// 检查所更新的用户名是否可用

function _checkUsername(req, res, next) {

var username = req.body.username;

/* 检查用户名是否可用 */

if(true){

// 除可以用res传递数据外,req同样也可以用于传递数据

req.username = true;

}

next()

}

出自:http://www.niefengjun.cn/

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/2966.html

标签: res.render
分享给朋友:

“express.js 应用-路由与路由中间件” 的相关文章

继Yuzu后,任天堂要求移除多个Switch模拟器项目

IT之家 7 月 11 日消息,任天堂美国分公司 (Nintendo of America) 已要求移除多个用于模拟 Nintendo Switch 游戏的开源模拟器项目,其中包括 Suyu、Nzu、Uzuy、Torzu、Sudachi 和 Yuzu-vanced 等。这些模拟器均被指控包含绕过任天...

2024年,不断突破的一年

迈凯伦F1车队不久前拿下了2024年度总冠军,距离上一次还是二十几年前。在此期间,另一领域内,一个充满革新活力的腕表品牌——RICHARD MILLE理查米尔,正不断发展,与F1运动、帆船、古董车展等领域,共享着对速度与极限的无尽向往。RICHARD MILLE的发展与F1车手们在赛道上的卓越表现交...

数组、去重、排序、合并、过滤、删除

ES6数字去重 Array.from(new Set([1,2,3,3,4,4])) //[1,2,3,4] [...new Set([1,2,3,3,4,4])] //[1,2,3,4]2、ES6数字排序 [1,2,3,4].sort(); // [1, 2,3,4],默认是升序...

22《Vue 入门教程》VueRouter 路由嵌套

1. 前言本小节我们介绍如何嵌套使用 VueRouter。嵌套路由在日常的开发中非常常见,如何定义和使用嵌套路由是本节的重点。同学们在学完本节课程之后需要自己多尝试配置路由。2. 配置嵌套路由实际项目中的应用界面,通常由多层嵌套的组件组合而成。同样地,URL 中各段动态路径也按某种结构对应嵌套的各层...

关于Vue页面跳转传参,参数不同, 但页面只获取参数一次的问题

#头条创作挑战赛#1.问题描述问题描述: element 展示表格(页面A),点击表格的每一行的查看详情按钮,可以携带此行的信息参数跳转到另一个页面(页面B),但是从A页面到B页面,只有第一次跳转的时候B页面可以获取到A页面的参数,返回再次A->B ,B页面无法获取到参数。2.解决办法:方法一...

uni-app开发微信小程序和h5应用

#头条创作挑战赛#本文同步本人掘金平台的文章:https://juejin.cn/post/6986465633114259469最近,有个需求需要开发H5应用和微信小程序。如果针对不同的平台开发自己的一套代码,那将是一件很糟糕的事情:如果下次需要兼容支付宝小程序、快应用,那工作量随着平台的添加而...