Nodejs(Express) - 02 路由
2019-11-21 本文已影响0人
Lisa_Guo
路由定义了哪个url由哪个函数响应。
url请求包含URI地址和请求方式(Get,Post等)
Express
有几种路由方式:
- app.METHOD // method 为get/post/delete等http操作的小写字母
- app.all() // 处理所有http请求
- app.use() // 使用中间件来提供路由
一、简单实现
通过app.Method实现路由映射
var express = require('express')
var app = express()
// respond with "hello world" when a GET request is made to the homepage
app.get('/', function (req, res) {
res.send('hello world')
})
app.post('/', function (req, res) {
res.send('Got a POST request')
})
1.1 route paths
url可使用普通string也可以使用正则表达式
下面的路由匹配请求url为 /.
app.get('/', function (req, res) {
res.send('root')
})
下面匹配 /about.
app.get('/about', function (req, res) {
res.send('about')
})
下面匹配 /random.text.
app.get('/random.text', function (req, res) {
res.send('random.text')
})
下面匹配 acd 和 abcd.
app.get('/ab?cd', function (req, res) {
res.send('ab?cd')
})
1.2 路由参数
可在路由url里用:variable使得服务器可以获取到参数
app.get('/users/:userId/books/:bookId', function (req, res) {
res.send(req.params)
})
访问http://localhost/users/123/books/abc, 则输出{"userId":"123","bookId":"abc"}
1.3 路由函数
同一个url可以对应多个路由函数
app.get('/example/b', function (req, res, next) {
console.log('the response will be sent by the next function ...')
next()
}, function (req, res) {
res.send('Hello from B!')
})
也可以通过数组方式传递
var cb0 = function (req, res, next) {
console.log('CB0')
next()
}
var cb1 = function (req, res, next) {
console.log('CB1')
next()
}
var cb2 = function (req, res) {
res.send('Hello from C!')
}
app.get('/example/c', [cb0, cb1, cb2])
1.4 路由顺序
路由匹配会从上到下逐一匹配,寻找第一个适合的url,所以url定义顺序很重要。
如下/users/delete和/users/:user_id, 如果/delete放在/:user_id之后,浏览器输入/users/delete/1,则匹配/:user_id的url导致匹配出错
router.get('/delete', async (req, res, next) => {
try {
const id = req.query.id
console.log(id, command.DELETE)
const result = await mysql.run(command.DELETE, id)
res.send(result)
} catch(err) {
res.status(500).send(err)
}
});
router.get('/:user_id', async (req, res, next) => {
try {
const id = req.params.user_id
const result = await mysql.run(command.SELECT, id)
res.send(result)
} catch(err) {
res.status(500).send(err)
}
});
二、express.Router中间件
通过express.Router中间件可以方便的实现模块化路由开发和管理
创建路由文件users.js,代码如下
var express = require('express')
var router = express.Router()
// define the home page route
router.get('/', function (req, res) {
res.send('User home page')
})
// define the about route
router.get('/about', function (req, res) {
res.send('About user')
})
module.exports = router
然后在主程序中引入
var express = require('express')
var app = express()
var users= require('./router/users')
app.use('/users', users)
app.listen(3001, () => console.log('listening on port 3001'))
app.use(url, router)
第一个参数定义路由文件的基路由
浏览器访问http://localhost:3000/users则返回User home page