当前位置: 首页 > 后端技术 > Node.js

学习使用ExpressJS4.0中新的Router

时间:2023-04-04 00:30:12 Node.js

概述ExpressJS4.0提出了一个新的路由Router。Router就像一个“迷你版”的express应用,它不引入views或settings,而是提供了routing应该有的API,.use,.get,.param和route。示例应用让我们创建一个只有几个路由和功能的express应用:基本路由:Home、About一个将请求打印到控制台的路由中间件一个带参数的路由一个验证特殊参数的路由中间件A用于登录路由、响应以/login路径进行GET和POST请求验证功能:验证传递给某个路由的参数应用程序文件架构我们只需要两个文件:-package.json//构建节点应用程序所需的插件-server.js//构建示例应用程序的启动文件我们将路由代码编写为server.js文件。以后为了让示例应用模块化,我们会将这些路由代码写到不同的文件中,甚至为网站的不同组件定义不同的路由文件。创建一个Node应用创建一个Node应用,我们需要编写一个package.json文件来定义Node应用所依赖的插件。{"name":"express-router-experiments","main":"server.js","dependencies":{"express":"~4.0.0"}}下面继续安装依赖:$npminstallNow我们安装了Express,让我们继续编写server.js来处理路由。为了创建服务器,我们在package.json中将主要属性值指定为server.js,因此Express将使用server.js作为应用程序的入口文件。//server.js//基本设置//====================================================varexpress=require('express');varapp=express();varport=process.env.PORT||8080;//路由//==================================================//示例路由app.get('/sample',function(req,res){res.send('thisisasample!');});//我们将在这里编写自己的路由//启动服务器//==================================================app.listen(port);console.log('魔法发生在端口'+port);现在我们可以使用命令nodeserver.js启动服务器。我们在Express3时代使用app.get创建路由。如果此时我们打开浏览器访问http://localhost:8080/sample,我们可以看到如下文字:thisisasample!。基本用法express.Router()下面我们一起写一个Node应用前端路由的例子,包括Homepage和Aboutpage。//server.js...//获取路由器实例varrouter=express.Router();//首页路由(http://localhost:8080)router.get('/',function(req,res){res.send('我是首页!');});//关于页面路由(http://localhost:8080/about)router.get('/about',function(req,res){res.send('imtheaboutpage!');});//将定义的路由集成到Node应用中app.use('/',router);...我们之前的代码使用express.Router()生成一个路由实例,定义路由规则,最后将这个路由实例集成到应用中。现在我们可以访问http://localhost:8080的主页和http://localhost:8080/about的关于页面。请注意:我们可以更改先前定义的路由中的默认根路径('/')。如果我们把app.use('/',router)改成app.use('/app',router),那么首页的访问地址就变成了http://localhost:8080/app,而关于页面变为http://localhost:8080/app/about。这是一个非常有用的特性,我们可以使用它来创建多个路由实例express.Router()并将这些实例集成到Node应用程序中。例如,你可以在一个Node应用中针对不同的功能需求创建不同的路由:基础路由、权限验证路由、其他API路由。通过这种方式,Node应用程序变得更加模块化并且更易于扩展。创建路由中间件Router.use()路由中间件实际上是一种允许在处理请求之前执行某些操作的机制。比如在返回一个请求的响应数据给用户之前,我们可以检查用户是否有权限,记录日志等等。接下来,我们实现一个打印日志的中间件。每次有请求时,我们都会在控制台上打印一条消息。//server.js...//获取路由器实例varrouter=express.Router();//路由中间件:router.use(function(req,res,next)每当有请求request时就会执行{//打印请求的方法和urlconsole.log(req.method,req.url);//继续处理请求请求,寻找匹配的路由next();});//首页路由(http://localhost:8080)router.get('/',function(req,res){res.send('我是首页!');});//关于页面路由(http://localhost:8080/about)router.get('/about',function(req,res){res.send('imtheaboutpage!');});//将定义的路由集成到Node应用程序app.use('/app',router);...我们使用router.use()来定义路由中间件并将其应用于对我们的Node应用程序的所有请求。打开浏览器访问http://localhost:8080/app,我们可以看到控制台打印的信息:imthehomepage!。在代码中,中间件和路由的位置顺序非常重要。当请求到来时,它们将在代码中按顺序执行。这意味着如果你在某个路由后面写中间件,路由会拦截请求并完成响应,中间件永远不会被执行。带参数路由/hello/:name我们想在URL中传递一个人的名字name,让NODE应用输出Helloname!这里可以使用带参数的路由。//server.js...//获取路由器实例varrouter=express.Router();...//带参数的路由(http://localhost:8080/hello/:name)router.get('/hello/:name',function(req,res){res.send('hello'+req.params.name+'!');});//将定义的路由集成到Node应用app.use('/',router);...现在我们访问http://localhost:8080/hello/holly可以看到浏览器页面显示的信息:Helloholly!创建参数中间件如果要验证上面URL中传入的人名,为了保证名字符合规范,我们需要在路由中间件中验证URL中的参数名。它有一个特殊的名字,参数中间件。我们可以使用express.param()来创建它。//server.js...//获取路由器实例varrouter=express.Router();...//参数中间件检查名称参数router.param('name',function(req,res,next,name){//这里执行验证操作console.log('doingnamevalidationson'+name);//如果验证通过,我们将验证过的名字赋值给req对象req.name=name;//继续处理请求并找到匹配的路由next();});//带参数的路由(http://localhost:8080/hello/:name)router.get('/hello/:name',function(req,res){res.send('hello'+req.name+'!');});//将定义好的路由集成到Node应用中app.use('/',router);现在当我们访问到/hello/:name路由后,我们写的参数中间件就会介入,进行相应的校验处理。为了验证,我们将验证过的名字赋值给req对象,在对应的.get路由中使用req.name获取验证过的名字。打开浏览器访问http://localhost:8080/hello/sally,我们可以看到浏览器显示的信息:Hellosally!控制台console打印:doingnamevalidationsonsally如果使用RESTfulAPI,甚至可以检查token是否有效来判断用户是否有权限访问。链式路由我们也可以直接在app对象上创建路由。使用app.route()为一个路由定义多个路由处理器。比如向/login路由发起get请求显示登录界面,也向/login路由发起post请求提交登录表单信息。我们可以使用app.route来创建这个/login路由。//路线//=================================================app.route('/login')//显示登录界面(GEThttp://localhost:8080/login).get(function(req,res){res.send('这是登录form');})//提交登录表单(POSThttp://localhost:8080/login).post(function(req,res){console.log('processing');res.send('processingtheloginform!');});...总结使用Express4.0中的路由,我们可以更灵活的定义路由:多次使用express.Router()定义一组路由使用express.Router()划分模块,并使用app.use()将它们整合起来,并使用路由中间件对请求进行预处理。使用参数middleware.param()来验证URL中的参数。使用app.route()创建链式路由。