• Node.js学习笔记_No.06


    Express

    Express的作用和Node.js内置的http模块类似,是专门用来创建Web服务器的。
    常见的两种服务器
    Web网站服务器:专门对外提供Web网页资源的服务器
    API接口服务器:专门对外提供API接口的服务器。


    创建基本的服务器
    //1. 导入express
    const express = require('express')
    
    //2. 创建web服务器
    const app = express()
    
    //4. 监听客户端的GET和POST请求,并向客户端响应具体的内容
    app.get('/user', (req, res) => {
        //调用express提供的res.send()方法,向客户端响应一个JSON对象
        res.send({
            name: 'zs',
            age: 20,
            gender: '男'
        })
    })
    app.post('/user', (req, res) => {
        //调用express提供的res.send()方法,向客户端响应一个文本字符串
        res.send('请求成功')
    })
    
    //获取URL中携带的查询参数
    app.get('/', (req, res) => {
        //通过 req.query 可以获取到客户端发送来的 查询参数
        //注意:默认情况下,req.query 是一个空对象
        console.log(req.query)
        res.send(req.query)
    })
    
    //获取URL中的动态参数(:动态参数)
    app.get('/user/:id/:username', (req, res) => {
        //req.params 是动态匹配到 URL 参数,默认也是空对象
        console.log(req.params)
        res.send(req.params)
    })
    
    //3. 启动 web 服务器
    app.listen(80, () => {
        console.log('express server runnning at http://127.0.0.1')
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    托管静态资源

    express.static():创建一个静态资源服务器

    Express在指定的静态目录中查找文件,并对外提供资源访问路径,所以,存放静态文件的目录名不会出现在URL中。

    如果要托管多个静态资源目录,请多次调用express.static()函数

    app.use(express.static('public'))
    app.use(express.static('files'))
    
    • 1
    • 2
    挂在路径前缀

    如果希望在托管的静态资源访问路径之前,挂载路径前缀,则可使用如下方式:

    app.use('public', express.static('public'))
    
    • 1

    此时就可以通过带/public前缀地址来访问public目录的文件了


    nodemon

    该工具能监听项目文件的变动,当代码被修改后,nodemon会自动帮我们重启项目,方便开发和调试

    npm install -g nodemon
    
    • 1

    路由

    广义上,路由是映射关系
    Express 中的路由指客户端的请求服务器处理函数之间的映射关系。
    EXpress中的路由由3部分组成,分别是请求的类型、请求的URL地址处理函数

    app.METHOD(PATH, HANDLER)
    
    • 1

    路由的使用
    把路由挂载在服务器实例上

    const express = require('express')
    const app = express()
    
    //挂载路由
    app.get('/', (req, res) => {
        res.send('hello world')
    })
    
    app.post('/', (req, res) => {
        res.send('Post Request')
    })
    
    
    app.listen(80, () => {
        console.log('http://127.0.0.1')
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    模块化路由
    为方便对路由进行模块化管理,Express不建议将路由直接挂载到app上,而是推荐路由抽离为单独的模块
    02模块化路由.js

    const express = require('express')
    const app = express()
    
    //1. 导入路由模块
    const router = require('./03router')
    //2. 注册路由模块
    /* app.use(router)*/
    app.use('/api', router) //添加前缀,类似于托管静态资源,为静态资源统一挂载访问前缀一样
    
    //注意:app.use() 函数的作业,就是来注册全局中间件
    
    app.listen(80, () => {
        console.log('http://127.0.0.1')
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    router.js

    //路由模块
    //1. 导入 express
    const express = require('express')
    //2. 创建路由对象
    const router = express.Router()
    
    //3. 挂载具体的路由
    router.get('/user/list', (req, res) => {
        res.send('Get user list')
    })
    
    router.post('/user/add', (req, res) => {
        res.send('Add')
    })
    
    //4. 向外到处路由对象
    module.exports = router
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    Express中间件

    本质是function处理函数,格式如下

    app.get('/', fuction(req, res, next){
    	next();
    })
    
    • 1
    • 2
    • 3
    调用流程

    当一个请求到达Express的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理
    在这里插入图片描述
    next函数:实现多过中间件连续到用的关键,他表示把流转关系转交给下一个中间件路由


    全局生效的中间件

    客户端发起任何请求,到达服务器后,都会触发的中间件

    const express = require('express')
    const app = express()
    
    //定义一个最简单的中间件函数
    const mw = function (req, res, next) {
        console.log('这是最简单的中间件函数')
        //把流转关系,转交给下一个中间件或路由
        next()
    }
    
    //将 mw 注册为全局生效的中间件
    app.use(mw)
    
    app.get('/', (req, res) => {
        console.log('调用了这个‘/’路由')
        res.send('Home page.')
    })
    app.get('/user', (req, res) => {
        console.log('调用了这个‘/user’路由')
        res.send('User page.')
    })
    
    app.listen(80, () => {
        console.log('http://127.0.0.1')
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    //简化形式
    app.use(function (req, res, next) {
        console.log('这是一个最简单的中间件函数')
        next()
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5

    中间件作用:多个中间件之间,共享同一份reqres,基于该特性,可以在上游的中间件统一为req或res对象添加自定义的属性或方法,供下游的中间件或路由使用。


    局部生效的中间件

    不使用app.use()定义的中间件,叫做局部生效的中间件

    //导入express模块
    const express = require('express')
    //创建express的服务器实例
    const app = express()
    
    //1. 定义中间件函数
    const mw1 = (req, res, next) => {
        console.log('调用了局部生效的中间件')
        next()
    }
    
    //2. 创建路由
    app.get('/', mw1, (req, res) => {//mw1就是局部中间件,只在当前路由生效,不会影响其他路由
        res.send('Home pages')
    })
    
    app.get('/user', (req, res) => {
        res.send('User pages')
    })
    
    //调用app.listen方法,指定端口号并启动web服务器
    app.listen(80, function () {
        console.log('Express server running at http://127.0.0.1')
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    定义多个局部中间件

    //两种写法都可
    app.get('/', mw1, mw2, (req, res) => {res.send('Home page.')})
    app.get('/', [mw1, mw2], (req, res) => {res.send('Home page.')})
    
    • 1
    • 2
    • 3
  • 相关阅读:
    第N6周:使用Word2vec实现文本分类
    Flutter 实现用户偏好标签设置
    vulfocus——骑士cms任意代码执行(CVE-2020-35339)
    Flink系列之Flink中Broadcast和Counter整理和实战
    Matlab调用可执行程序、传递参数以及接收输出
    Pytorch入门实例的分解写法
    Spring Boot + EasyExcel导入导出,简直太好用了!
    网页设计与制作项目三“网上花店”
    wsl使用vscode连接,远程安装C/C++ 拓展时,报错
    vscode Markdown使用
  • 原文地址:https://blog.csdn.net/m0_55825393/article/details/126369952