在使用 Express.js 搭建 Web 应用的过程中,路由是非常重要的组成部分。它指定了 Web 应用中不同 URL 地址对应的代码逻辑,以便服务器能对不同的请求做出正确的响应。本文将详细介绍 Express.js 中的路由是如何工作的,并提供指导性的学习和示例代码。
基本概念
在 Express.js 中,一个路由是由一个 HTTP 方法和一个 URL 地址组成的。例如,以下是一个基本路由的声明:
app.get('/', function(req, res) { res.send('Hello, world!'); });
在这个例子中,app.get
方法指定了一个 HTTP GET 请求和 URL 地址,这个 URL 地址是根路由 /
。当一个 HTTP GET 请求匹配到这个路由时,一个回调函数将被执行。这个回调函数包含两个参数:请求对象 req
和响应对象 res
。在这个例子中,回调函数通过 res.send
方法将 Hello, world!
这个字符串作为响应返回到客户端。
不仅如此,我们还可以使用 app.post
、app.put
、app.delete
等方法来创建其他类型的路由。例如,以下代码演示了如何创建一个处理 POST 请求的路由:
app.post('/users', function(req, res) { res.send('User has been created!'); });
在这个例子中,app.post
方法指定了一个 HTTP POST 请求和 URL 地址 /users
。当一个 HTTP POST 请求匹配到这个路由时,回调函数将会被执行,并且通过 res.send
方法将一个字符串作为响应返回到客户端。
路由参数
除了基本的路由外,Express.js 还支持路由参数,它可以用来捕捉 URL 中的特定部分。例如,以下是一个带有路由参数的路由声明:
app.get('/users/:userId', function(req, res) { res.send('The user ID is: ' + req.params.userId); });
在这个例子中,我们使用 :userId
来声明一个路由参数,表示任何以 /users/
开头并且后面紧跟着一个字符串的 URL 地址都能匹配到这个路由。例如,/users/123
、/users/hello
都是有效的匹配。
当一个请求匹配到这个路由时,路由参数的值将会被解析到请求对象的 params
属性中。在这个例子中,我们使用 req.params.userId
来获取路由参数的值,并使用它来产生响应。
路由中间件
除了可以在路由中定义回调函数外,还可以把一系列中间件函数串联到一起来处理 HTTP 请求。这样做的好处在于让代码更加模块化,易于维护。例如,以下是一个使用路由中间件的例子:
function logRequest(req, res, next) { console.log('HTTP request received...'); next(); } app.get('/users/:userId', logRequest, function(req, res) { res.send('The user ID is: ' + req.params.userId); });
在这个例子中,我们使用一个名为 logRequest
的中间件函数来打印出每一个 HTTP 请求的日志。中间件函数接收三个参数:请求对象 req
、响应对象 res
、以及一个表示下一个中间件函数的参数 next
。每当一个请求到达这个路由时,会按照 logRequest
、路由回调函数的顺序调用中间件函数。在中间件函数的最后,使用 next()
方法来调用下一个中间件函数。
总结
本文介绍了 Express.js 中的路由是如何工作的,包括了路由基本概念、路由参数和路由中间件。路由是架构 Web 应用的重要组成部分,了解它的工作原理和使用方法对提高应用的性能、可维护性和可扩展性都非常重要。
示例代码:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ---------- -------- --------------- ---- ----- - ----------------- ------- -------------- ------- - ------------ ------------- ---- - ---------------- --------- --- ------------------ ------------- ---- - -------------- --- ---- ----------- --- ------------------------- ----------- ------------- ---- - ------------- ---- -- --- - - ------------------- --- ---------------- ---------- - ------------------- ------- -- ---- ---------- ---
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6647f4c4d3423812e467ddfc