3.2 路由
前面我们只是挂载了根路径的路由控制器,现在修改 index.js 如下:
const express = require('express')
const app = express()
app.get('/', function (req, res) {
res.send('hello, express')
})
app.get('/users/:name', function (req, res) {
res.send('hello, ' + req.params.name)
})
app.listen(3000)
以上代码的意思是:当访问根路径时,依然返回 hello, express,当访问如 localhost:3000/users/nswbmw
路径时,返回 hello, nswbmw。路径中 :name
起了占位符的作用,这个占位符的名字是 name,可以通过 req.params.name
取到实际的值。
小提示:express 使用了 path-to-regexp 模块实现的路由匹配。
不难看出:req 包含了请求来的相关信息,res 则用来返回该请求的响应,更多请查阅 express 官方文档。下面介绍几个常用的 req 的属性:
req.query
: 解析后的 url 中的 querystring,如?name=haha
,req.query 的值为{name: 'haha'}
req.params
: 解析 url 中的占位符,如/:name
,访问 /haha,req.params 的值为{name: 'haha'}
req.body
: 解析后请求体,需使用相关的模块,如 body-parser,请求体为{"name": "haha"}
,则 req.body 为{name: 'haha'}
3.2.1 express.Router
上面只是很简单的路由使用的例子(将所有路由控制函数都放到了 index.js),但在实际开发中通常有几十甚至上百的路由,都写在 index.js 既臃肿又不好维护,这时可以使用 express.Router 实现更优雅的路由解决方案。在 myblog 目录下创建空文件夹 routes,在 routes 目录下创建 index.js 和 users.js。最后代码如下:
index.js
const express = require('express')
const app = express()
const indexRouter = require('./routes/index')
const userRouter = require('./routes/users')
app.use('/', indexRouter)
app.use('/users', userRouter)
app.listen(3000)
routes/index.js
const express = require('express')
const router = express.Router()
router.get('/', function (req, res) {
res.send('hello, express')
})
module.exports = router
routes/users.js
const express = require('express')
const router = express.Router()
router.get('/:name', function (req, res) {
res.send('hello, ' + req.params.name)
})
module.exports = router
以上代码的意思是:我们将 /
和 /users/:name
的路由分别放到了 routes/index.js 和 routes/users.js 中,每个路由文件通过生成一个 express.Router 实例 router 并导出,通过 app.use
挂载到不同的路径。这两种代码实现了相同的功能,但在实际开发中推荐使用 express.Router 将不同的路由分离到不同的路由文件中。
更多 express.Router 的用法见 express 官方文档。