美文网首页
Nodejs(Express) - 02 路由

Nodejs(Express) - 02 路由

作者: Lisa_Guo | 来源:发表于2019-11-21 18:20 被阅读0次

    路由定义了哪个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

    相关文章

      网友评论

          本文标题:Nodejs(Express) - 02 路由

          本文链接:https://www.haomeiwen.com/subject/onytwctx.html