Nodejs(Express) - 02 路由

2019-11-21  本文已影响0人  Lisa_Guo

路由定义了哪个url由哪个函数响应。
url请求包含URI地址和请求方式(Get,Post等)
Express有几种路由方式:

一、简单实现

通过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

上一篇下一篇

猜你喜欢

热点阅读