Node.js学习笔记-express

文章目录

  • 1认识express
    • 1.1基本使用
  • 2监听get和post请求&处理参数
  • 3获取url中查询参数
    • 3.1req.query
    • 3.2req.params
    • 3.3注意点
  • 4静态资源处理
    • 4.1托管多个静态目录
    • 4.2挂在路径前缀
  • 5express中路由
    • 5.1路由匹配过程
    • 5.2路由模块化
    • 5.3注册路由模块
    • 5.4为路由模块添加前缀
  • 6express中间件
    • 6.1next()作用
    • 6.2定义中间件函数
    • 6.3全局生效中间件
    • 6.4中间件作用
    • 6.5定义多个中间件
    • 6.6局部生效中间件
    • 6.7中间件注意事项
    • 6.8中间件分类
      • 6.8.1应用级别中间件
      • 6.8.2路由级别中间件
      • 6.8.3错误级别中间件
      • 6.8.4内置中间件
      • 6.8.5第三方中间件
    • 6.9自定义中间件
  • 7express写接口
    • 7.1cors解决接口跨域
    • 7.2cors三个响应头
      • 7.2.1Access-Control-Allow-Origin
      • 7.2.2Access-Control-Allow-Headers
      • 7.2.3Access-Control-Allow-Methods
    • 7.3cors 简单请求与预检请求
  • 8编写JSONP接口

学习视频
https://www.bilibili.com/video/BV1a34y167AZ?p=38&vd_source=768417f81fbc54ab7a985afe61e255e4
学习资料
https://pan.baidu.com/s/19STqmQyTMF9r_pixhyX44g?pwd=1234

1认识express

Node.js学习笔记-express_第1张图片
Node.js学习笔记-express_第2张图片
Node.js学习笔记-express_第3张图片
Node.js学习笔记-express_第4张图片
Node.js学习笔记-express_第5张图片

1.1基本使用

Node.js学习笔记-express_第6张图片
Node.js学习笔记-express_第7张图片

2监听get和post请求&处理参数

Node.js学习笔记-express_第8张图片
Node.js学习笔记-express_第9张图片
Node.js学习笔记-express_第10张图片

const express = require("express");
const app = express();
app.get("/use",function(req,res) {
    res.send({name:"name",age:"age"})
    
})
app.listen(8001, () =>
console.log(`Server started on 127.0.0.1}`)
);

Node.js学习笔记-express_第11张图片

3获取url中查询参数

3.1req.query

Node.js学习笔记-express_第12张图片

const express = require("express");
const app = express();
app.get("/",function(req,res) {
    //通过req.qurey可以获取客户端送过来的查询参数
    //默认情况下res.query是一个空对象
   console.log(req.query)
   res.send(req.query)
    
})
app.listen(8001, () =>
console.log(`Server started on 127.0.0.1}`)
);

Node.js学习笔记-express_第13张图片
Node.js学习笔记-express_第14张图片

3.2req.params

Node.js学习笔记-express_第15张图片

const express = require("express");
const app = express();
// app.get("/",function(req,res) {
//     //通过req.qurey可以获取客户端送过来的查询参数
//     //默认情况下res.query是一个空对象
//    console.log(req.query)
//    res.send(req.query)
    
// })
app.get("/:id",function(req,res) {
    //:id是一个动态参数,默认是空对象
   console.log(req.params)
   res.send(req.params)
    
})
app.listen(8001, () =>
console.log(`Server started on 127.0.0.1}`)
);

Node.js学习笔记-express_第16张图片
Node.js学习笔记-express_第17张图片

3.3注意点

1:id只要存在:就好了,后面是名称
在这里插入图片描述
2可以有多个动态参数
Node.js学习笔记-express_第18张图片

Node.js学习笔记-express_第19张图片

4静态资源处理

Node.js学习笔记-express_第20张图片
在这里插入图片描述
public不会出现在访问目录中
Node.js学习笔记-express_第21张图片

const express = require('express')
const app = express()

// 在这里,调用 express.static() 方法,快速的对外提供静态资源
app.use('/files', express.static('./files'))
app.use(express.static('./clock'))

app.listen(80, () => {
  console.log('express server running at http://127.0.0.1')
})

Node.js学习笔记-express_第22张图片

4.1托管多个静态目录

Node.js学习笔记-express_第23张图片

4.2挂在路径前缀

Node.js学习笔记-express_第24张图片

const express = require('express')
const app = express()

// 在这里,调用 express.static() 方法,快速的对外提供静态资源
app.use('/files', express.static('./files'))
app.use(express.static('./clock'))

app.listen(80, () => {
  console.log('express server running at http://127.0.0.1')
})

5express中路由

Node.js学习笔记-express_第25张图片
Node.js学习笔记-express_第26张图片
Node.js学习笔记-express_第27张图片

5.1路由匹配过程

Node.js学习笔记-express_第28张图片
Node.js学习笔记-express_第29张图片

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')
})

Node.js学习笔记-express_第30张图片

5.2路由模块化

Node.js学习笔记-express_第31张图片
Node.js学习笔记-express_第32张图片

5.3注册路由模块

Node.js学习笔记-express_第33张图片
Node.js学习笔记-express_第34张图片

const express = require('express')
const app = express()

// app.use('/files', express.static('./files'))

// 1. 导入路由模块
const router = require('./03.router')
// 2. 注册路由模块
// app.use('/api', router)
app.use(router)
// 注意: app.use() 函数的作用,就是来注册全局中间件

app.listen(8002, () => {
  console.log('http://127.0.0.1')
})

// 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 new user.')
})

// 4. 向外导出路由对象
module.exports = router

在这里插入图片描述

5.4为路由模块添加前缀

Node.js学习笔记-express_第35张图片
Node.js学习笔记-express_第36张图片

6express中间件

Node.js学习笔记-express_第37张图片
Node.js学习笔记-express_第38张图片Node.js学习笔记-express_第39张图片

6.1next()作用

Node.js学习笔记-express_第40张图片

6.2定义中间件函数

Node.js学习笔记-express_第41张图片

Node.js学习笔记-express_第42张图片

const express = require('express')
const app = express()

// // 定义一个最简单的中间件函数
// const mw = function (req, res, next) {
//   console.log('这是最简单的中间件函数')
//   // 把流转关系,转交给下一个中间件或路由
//   next()
// }

// // 将 mw 注册为全局生效的中间件
// app.use(mw)

// 这是定义全局中间件的简化形式
app.use((req, res, next) => {
  console.log('这是最简单的中间件函数')
  next()
})

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')
})

每次在postmanget测试都会在终端打印,说明中间件成功
Node.js学习笔记-express_第43张图片

Node.js学习笔记-express_第44张图片

6.3全局生效中间件

Node.js学习笔记-express_第45张图片
Node.js学习笔记-express_第46张图片

6.4中间件作用

Node.js学习笔记-express_第47张图片

const express = require('express')
const app = express()

// 这是定义全局中间件的简化形式
app.use((req, res, next) => {
  // 获取到请求到达服务器的时间
  const time = Date.now()
  // 为 req 对象,挂载自定义属性,从而把时间共享给后面的所有路由
  req.startTime = time
  next()
})

app.get('/', (req, res) => {
  res.send('Home page.' + req.startTime)
})
app.get('/user', (req, res) => {
  res.send('User page.' + req.startTime)
})

app.listen(80, () => {
  console.log('http://127.0.0.1')
})

6.5定义多个中间件

Node.js学习笔记-express_第48张图片

const express = require('express')
const app = express()

// 定义第一个全局中间件
app.use((req, res, next) => {
  console.log('调用了第1个全局中间件')
  next()
})
// 定义第二个全局中间件
app.use((req, res, next) => {
  console.log('调用了第2个全局中间件')
  next()
})

// 定义一个路由
app.get('/user', (req, res) => {
  res.send('User page.')
})

app.listen(80, () => {
  console.log('http://127.0.0.1')
})

6.6局部生效中间件

Node.js学习笔记-express_第49张图片

// 导入 express 模块
const express = require('express')
// 创建 express 的服务器实例
const app = express()

// 1. 定义中间件函数
const mw1 = (req, res, next) => {
  console.log('调用了局部生效的中间件')
  next()
}

// 2. 创建路由
app.get('/', mw1, (req, res) => {
  res.send('Home page.')
})
app.get('/user', (req, res) => {
  res.send('User page.')
})

// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(80, function () {
  console.log('Express server running at http://127.0.0.1')
})

Node.js学习笔记-express_第50张图片

6.7中间件注意事项

Node.js学习笔记-express_第51张图片

6.8中间件分类

Node.js学习笔记-express_第52张图片

6.8.1应用级别中间件

Node.js学习笔记-express_第53张图片

6.8.2路由级别中间件

Node.js学习笔记-express_第54张图片

6.8.3错误级别中间件

Node.js学习笔记-express_第55张图片
错误级别中间件必须注册在所有路由之后,路由内发生错误会在路由后方查找错误中间件

// 导入 express 模块
const express = require('express')
// 创建 express 的服务器实例
const app = express()

// 1. 定义路由
app.get('/', (req, res) => {
  // 1.1 人为的制造错误
  throw new Error('服务器内部发生了错误!')
  res.send('Home page.')
})

// 2. 定义错误级别的中间件,捕获整个项目的异常错误,从而防止程序的崩溃
app.use((err, req, res, next) => {
  console.log('发生了错误!' + err.message)
  res.send('Error:' + err.message)
})

// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(80, function () {
  console.log('Express server running at http://127.0.0.1')
})

6.8.4内置中间件

Node.js学习笔记-express_第56张图片

// 导入 express 模块
const express = require('express')
// 创建 express 的服务器实例
const app = express()

// 注意:除了错误级别的中间件,其他的中间件,必须在路由之前进行配置
// 通过 express.json() 这个中间件,解析表单中的 JSON 格式的数据
app.use(express.json())
// 通过 express.urlencoded() 这个中间件,来解析 表单中的 url-encoded 格式的数据
app.use(express.urlencoded({ extended: false }))

app.post('/user', (req, res) => {
  // 在服务器,可以使用 req.body 这个属性,来接收客户端发送过来的请求体数据
  // 默认情况下,如果不配置解析表单数据的中间件,则 req.body 默认等于 undefined
  console.log(req.body)
  res.send('ok')
})

app.post('/book', (req, res) => {
  // 在服务器端,可以通过 req,body 来获取 JSON 格式的表单数据和 url-encoded 格式的数据
  console.log(req.body)
  res.send('ok')
})

// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(80, function () {
  console.log('Express server running at http://127.0.0.1')
})

Node.js学习笔记-express_第57张图片
如果不加上json中间件,打印出来是undefined
Node.js学习笔记-express_第58张图片
不加url-endeconded是会传输{}对象,加入后会正常显示

6.8.5第三方中间件

Node.js学习笔记-express_第59张图片

// 导入 express 模块
const express = require('express')
// 创建 express 的服务器实例
const app = express()

// 1. 导入解析表单数据的中间件 body-parser
const parser = require('body-parser')
// 2. 使用 app.use() 注册中间件
app.use(parser.urlencoded({ extended: false }))
// app.use(express.urlencoded({ extended: false }))

app.post('/user', (req, res) => {
  // 如果没有配置任何解析表单数据的中间件,则 req.body 默认等于 undefined
  console.log(req.body)
  res.send('ok')
})

// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(80, function () {
  console.log('Express server running at http://127.0.0.1')
})

express内置的express.urlencoded中间件,就是基于body-parse这个第三方中间件进一步封装出来的.

6.9自定义中间件

Node.js学习笔记-express_第60张图片
Node.js学习笔记-express_第61张图片
Node.js学习笔记-express_第62张图片
在这里插入图片描述Node.js学习笔记-express_第63张图片

在这里插入图片描述
Node.js学习笔记-express_第64张图片

在这里插入图片描述
Node.js学习笔记-express_第65张图片Node.js学习笔记-express_第66张图片

// 导入 express 模块
const express = require('express')
// 创建 express 的服务器实例
const app = express()
// 导入 Node.js 内置的 querystring 模块
const qs = require('querystring')

// 这是解析表单数据的中间件
app.use((req, res, next) => {
  // 定义中间件具体的业务逻辑
  // 1. 定义一个 str 字符串,专门用来存储客户端发送过来的请求体数据
  let str = ''
  // 2. 监听 req 的 data 事件
  req.on('data', (chunk) => {
    str += chunk
  })
  // 3. 监听 req 的 end 事件
  req.on('end', () => {
    // 在 str 中存放的是完整的请求体数据
    // console.log(str)
    // TODO: 把字符串格式的请求体数据,解析成对象格式
    const body = qs.parse(str)
    req.body = body
    next()
  })
})

app.post('/user', (req, res) => {
  res.send(req.body)
})

// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(80, function () {
  console.log('Express server running at http://127.0.0.1')
})

Node.js学习笔记-express_第67张图片
对其拆封

// 导入 express 模块
const express = require('express')
// 创建 express 的服务器实例
const app = express()

// 1. 导入自己封装的中间件模块
const customBodyParser = require('./14.custom-body-parser')
// 2. 将自定义的中间件函数,注册为全局可用的中间件
app.use(customBodyParser)

app.post('/user', (req, res) => {
  res.send(req.body)
})

// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(80, function () {
  console.log('Express server running at http://127.0.0.1')
})

// 导入 Node.js 内置的 querystring 模块
const qs = require('querystring')

const bodyParser = (req, res, next) => {
  // 定义中间件具体的业务逻辑
  // 1. 定义一个 str 字符串,专门用来存储客户端发送过来的请求体数据
  let str = ''
  // 2. 监听 req 的 data 事件
  req.on('data', (chunk) => {
    str += chunk
  })
  // 3. 监听 req 的 end 事件
  req.on('end', () => {
    // 在 str 中存放的是完整的请求体数据
    // console.log(str)
    // TODO: 把字符串格式的请求体数据,解析成对象格式
    const body = qs.parse(str)
    req.body = body
    next()
  })
}

module.exports = bodyParser

7express写接口

Node.js学习笔记-express_第68张图片
Node.js学习笔记-express_第69张图片
Node.js学习笔记-express_第70张图片
Node.js学习笔记-express_第71张图片
Node.js学习笔记-express_第72张图片
Node.js学习笔记-express_第73张图片Node.js学习笔记-express_第74张图片

// 导入 express
const express = require('express')
// 创建服务器实例
const app = express()

// 配置解析表单数据的中间件
app.use(express.urlencoded({ extended: false }))

// 必须在配置 cors 中间件之前,配置 JSONP 的接口
app.get('/api/jsonp', (req, res) => {
  // TODO: 定义 JSONP 接口具体的实现过程
  // 1. 得到函数的名称
  const funcName = req.query.callback
  // 2. 定义要发送到客户端的数据对象
  const data = { name: 'zs', age: 22 }
  // 3. 拼接出一个函数的调用
  const scriptStr = `${funcName}(${JSON.stringify(data)})`
  // 4. 把拼接的字符串,响应给客户端
  res.send(scriptStr)
})

// 一定要在路由之前,配置 cors 这个中间件,从而解决接口跨域的问题
const cors = require('cors')
app.use(cors())

// 导入路由模块
const router = require('./16.apiRouter')
// 把路由模块,注册到 app 上
app.use('/api', router)

// 启动服务器
app.listen(80, () => {
  console.log('express server running at http://127.0.0.1')
})

const express = require('express')
const router = express.Router()

// 在这里挂载对应的路由
router.get('/get', (req, res) => {
  // 通过 req.query 获取客户端通过查询字符串,发送到服务器的数据
  const query = req.query
  // 调用 res.send() 方法,向客户端响应处理的结果
  res.send({
    status: 0, // 0 表示处理成功,1 表示处理失败
    msg: 'GET 请求成功!', // 状态的描述
    data: query, // 需要响应给客户端的数据
  })
})

// 定义 POST 接口
router.post('/post', (req, res) => {
  // 通过 req.body 获取请求体中包含的 url-encoded 格式的数据
  const body = req.body
  // 调用 res.send() 方法,向客户端响应结果
  res.send({
    status: 0,
    msg: 'POST 请求成功!',
    data: body,
  })
})

// 定义 DELETE 接口
router.delete('/delete', (req, res) => {
  res.send({
    status: 0,
    msg: 'DELETE请求成功',
  })
})

module.exports = router

7.1cors解决接口跨域

端口 url 或者协议不同就存在跨域问题
Node.js学习笔记-express_第75张图片

// 导入 express
const express = require('express')
// 创建服务器实例
const app = express()

// 配置解析表单数据的中间件
app.use(express.urlencoded({ extended: false }))

// 必须在配置 cors 中间件之前,配置 JSONP 的接口
app.get('/api/jsonp', (req, res) => {
  // TODO: 定义 JSONP 接口具体的实现过程
  // 1. 得到函数的名称
  const funcName = req.query.callback
  // 2. 定义要发送到客户端的数据对象
  const data = { name: 'zs', age: 22 }
  // 3. 拼接出一个函数的调用
  const scriptStr = `${funcName}(${JSON.stringify(data)})`
  // 4. 把拼接的字符串,响应给客户端
  res.send(scriptStr)
})

// 一定要在路由之前,配置 cors 这个中间件,从而解决接口跨域的问题
const cors = require('cors')
app.use(cors())

// 导入路由模块
const router = require('./16.apiRouter')
// 把路由模块,注册到 app 上
app.use('/api', router)

// 启动服务器
app.listen(80, () => {
  console.log('express server running at http://127.0.0.1')
})

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js"></script>
  </head>
  <body>
    <button id="btnGET">GET</button>
    <button id="btnPOST">POST</button>
    <button id="btnDelete">DELETE</button>
    <button id="btnJSONP">JSONP</button>

    <script>
      $(function () {
        // 1. 测试GET接口
        $('#btnGET').on('click', function () {
          $.ajax({
            type: 'GET',
            url: 'http://127.0.0.1/api/get',
            data: { name: 'zs', age: 20 },
            success: function (res) {
              console.log(res)
            },
          })
        })
        // 2. 测试POST接口
        $('#btnPOST').on('click', function () {
          $.ajax({
            type: 'POST',
            url: 'http://127.0.0.1/api/post',
            data: { bookname: '水浒传', author: '施耐庵' },
            success: function (res) {
              console.log(res)
            },
          })
        })

        // 3. 为删除按钮绑定点击事件处理函数
        $('#btnDelete').on('click', function () {
          $.ajax({
            type: 'DELETE',
            url: 'http://127.0.0.1/api/delete',
            success: function (res) {
              console.log(res)
            },
          })
        })

        // 4. 为 JSONP 按钮绑定点击事件处理函数
        $('#btnJSONP').on('click', function () {
          $.ajax({
            type: 'GET',
            url: 'http://127.0.0.1/api/jsonp',
            dataType: 'jsonp',
            success: function (res) {
              console.log(res)
            },
          })
        })
      })
    </script>
  </body>
</html>

7.2cors三个响应头

7.2.1Access-Control-Allow-Origin

Node.js学习笔记-express_第76张图片Node.js学习笔记-express_第77张图片

7.2.2Access-Control-Allow-Headers

Node.js学习笔记-express_第78张图片

7.2.3Access-Control-Allow-Methods

Node.js学习笔记-express_第79张图片

7.3cors 简单请求与预检请求

Node.js学习笔记-express_第80张图片
Node.js学习笔记-express_第81张图片
Node.js学习笔记-express_第82张图片
Node.js学习笔记-express_第83张图片

8编写JSONP接口

Node.js学习笔记-express_第84张图片

Node.js学习笔记-express_第85张图片
Node.js学习笔记-express_第86张图片
Node.js学习笔记-express_第87张图片
Node.js学习笔记-express_第88张图片

你可能感兴趣的:(前端,node.js,学习,express)