node.js 学习入门(07 - express 模块创建基本 web 服务器)(下)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: node.js 学习入门(07 - express 模块创建基本 web 服务器)

9. 内置中间件的使用

解析表单中 JSON、url-encoded 格式数据的方法

const express = require('express')
const app = express()
// 注意:除了错误级别的中间件,其他的中间件,必须在路由之前进行配置
// 通过 express.json() 这个中间件,解析表单中的 JSON 格式的数据
app.use(express.json())
// 通过 express.urlencoded() 这个中间件,来解析 表单中的 url-encoded 格式的数据
app.use(express.urlencoded({extended:false}))
// 创建路由
app.post('/', (req, res) => {
    // 在服务器,可以使用 req.body 这个属性,来接收客户端发送过来的请求体数据
    // 默认情况下,如果不配置解析表单数据的中间件,则 req.body 默认等于 undefined
    res.send("ok")
})
app.listen(80, () => {
    console.log("express server running at http://127.0.0.1")
})

10. body-parser中间件的使用

作用和内置中间件类似,的是用来解析 url-encoded 格式数据的方法,需要进行安装和引入

  • 安装body-parser中间件的指令
npm install body-parser
  • body-parser中间件的使用方法
const express = require('express')
const app = express()
// 导入中间件 body-parser
const parser = require('body-parser')
//  和内置中间件类似
app.use(parser.urlencoded({extended:false}))
// app.use(express.urlencoded({extended:false}))
// 创建路由
app.get('/user', (req, res) => {
    // 如果没有配置任何解析表单数据的中间件,则 req.body 默认等于 undefined
    console.log(req.body)
    res.send("ok")
})
app.listen(80, () => {
    console.log("express server running at http://127.0.0.1")
})

11. 自定义解析表单数据的中间件

自己定义一个解析 url-encoded 格式数据的方法

const express = require('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(80, () => {
    console.log("express server running at http://127.0.0.1")
})

12. 解决接口跨域问题

安装 cors 插件

npm install cors

引入 cors 插件,并把 cors 注册为全局中间件

一定要在路由之前,配置 cors 这个中间件,从而解决接口跨域的问题

const cors = require('cors')
app.use(cors())

13. 使用 express 写接口

下面的案例引用了 express 中的所有方法

  • 入口文件
// 导入 express
const express = require('express')
// 创建服务器实例
const app = express()
// 配置解析表单数据的中间件
app.use(express.json())
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:18}
    // 3. 拼接出一个函数的调用
    const scriptStr = `${funcName}(${JSON.stringify(data)})`
    // 4. 把拼接的字符串,响应给客户端
    res.send(scriptStr)
})
//一定要在路由之前,配置 cors 这个中间件,从而解决接口跨域的问题
const cors = require('cors')
app.use(cors())
// 导入路由模块
const router = require('./18-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, // 0 表示处理成功,1 表示处理失败
        msg: "POST 请求成功!", // 状态的描述
        data:body, // 需要响应给客户端的数据
    })
})
// 定义 DELETE 接口(预检请求)
// 简单请求的特点:客户端和服务器之间只会发生一次请求
// 预检请求的特点:客户端和服务器之间只会发生二次请求,OPTION 预检请求之后,才会发起真正的请求
router.delete('/delete', (req, res) => {
    // 通过 req.body 获取请求体中包含的 url-encoded 格式的数据
    // const body = req.body
    // 调用 res.send() 方法,向客户端响应处理的结果
    res.send({
        status: 0, // 0 表示处理成功,1 表示处理失败
        msg: "DELETE 请求成功!", // 状态的描述
        // data:body, // 需要响应给客户端的数据
    })
})
module.exports = router

14. cors请求的分类

客户端在请求 CORS 接口时,根据请求方式和请求头的不同,可以将 CORS 的请求分为两大类,分别是:

  • 简单请求
  • 预检请求

简单请求:


同时满足以下两大条件的请求,就属于简单请求

请求方式:GET、POST、HEAD 三者之一

HTTP 头部信息不超过9种字段


预检请求:


只要符合以下任何一个条件的请求,都需要进行预检请求

请求方式为 GET、POST、HEAD 之外的请求 Method 类型

请求头中包含自定义头部字段

向服务器发送了 application/json 格式的数据

以上就是 node.js 中 使用 express 模块创建基本 web 服务器的方法,不懂得也可以在评论区里问我,以后会持续发布一些新的功能,敬请关注。


相关文章
|
2天前
|
缓存 JavaScript 前端开发
JavaScript进阶 - Web Workers与Service Worker
【7月更文挑战第4天】JavaScript的Web Workers和Service Worker增强了Web性能。Web Workers处理后台多线程,减轻主线程负担,但通信有开销,受同源策略限制。Service Worker则用于离线缓存和推送通知,需管理其生命周期、更新策略,并确保安全。两者都带来了挑战,但也极大提升了用户体验。通过理解和优化,开发者能构建更高效、安全的Web应用。
|
1天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的英语学习交流平台小程序附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的英语学习交流平台小程序附带文章源码部署视频讲解等
5 0
|
1天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的学习资源推送系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的学习资源推送系统附带文章源码部署视频讲解等
5 0
|
1天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的可视化的学习系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的可视化的学习系统附带文章源码部署视频讲解等
5 0
|
1天前
|
Web App开发
软件开发常见流程之移动端调试方法,利用Chrome(谷歌浏览器)的模拟手机调试,搭建本地Web服务器,手机和服务器在一个局域网,通过手机访问服务器,使用服务器,利用ip实现域名访问
软件开发常见流程之移动端调试方法,利用Chrome(谷歌浏览器)的模拟手机调试,搭建本地Web服务器,手机和服务器在一个局域网,通过手机访问服务器,使用服务器,利用ip实现域名访问
|
3天前
|
Dart JavaScript 前端开发
flutter-web中使用js工具类
flutter-web中使用js工具类
|
3天前
|
存储 前端开发 JavaScript
|
3天前
|
消息中间件 前端开发 JavaScript
|
3天前
|
JSON JavaScript 前端开发
|
3天前
|
JavaScript 前端开发