【Node.js入门笔记10---http 模块】

news2025/3/27 10:06:31

Node.js入门笔记10

  • Node.js---http 模块
  • 一、核心功能
    • 0.学习http的前提
    • 1. 创建 HTTP 服务器
    • 2. 处理请求和响应
  • 二、进阶用法
    • 1. 路由管理
    • 2. 处理 POST 请求
    • 3. 中间件模式
  • 三、常见场景
  • 四、错误处理与安全
  • 五、对比 http 与 Express
  • 六、工具库推荐:

Node.js—http 模块

什么是客户端、什么是服务器?
在网络节点中,负责消费资源的电脑,叫做客户端;负责对外提供网络资源的电脑,叫做服务器

http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。用于创建 HTTP 服务器和客户端。http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。通过 http 模块提供的 http.createServer0 方法,就能方便的把一台普通的电脑,变成一台 Web 服务器,从而对外提供 Web 资源服务。

一、核心功能

0.学习http的前提

  1. IP 地址:是互联网上每台计算机的唯一地址,因此IP 地址具有唯一性。如果把“个人电脑”比作"一台电话”,那么"IP地址”就相当于“电话号码”,只有在知道对方IP 地址的前提下,才能与对应的电脑之间进行数据通信。

    IP 地址的格式:通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d 都是 0~255 之间的十进制整数。例如:用点分十进表示的IP地址(192.168.1.1)

    互联网中每台 Web 服务器,都有自己的 IP 地址,例如:大家可以在 Windows 的终端中运行 ping www.baidu.com 命令,即可查看到百度服务器的IP 地址。

    在开发期间,自己的电脑既是一台服务器,也是一个客户端,为了方便测试,可以在自己的浏览器中输入 127.0.0.1 这个IP 地址,就能把自己的电脑当做一服务器进行访问了。

  2. 域名和域名服务器:尽管 IP地址能够唯一地标记网络上的计算机,但!P地址是一长串数字,不直观,而且不便于记忆,于是人们又发明了另一套字符型的地址方案,即所谓的域名(Domain Name)地址。IP地址和域名是–对应的关系,这份对应关系存放在一种叫做域名服务器(DNS,Domain name server)的电脑中。使用者只需通过好记的域名访问对应的服务器即可,对应的转换工作由域名服务器实现。因此,域名服务器就是提供IP 地址和域名之间的转换服务的服务器。

    在开发测试期间,127.0.01对应的域名是localhost,它们都代表我们自己的这台电脑,在使用效果上没有任何区别。

  3. 端口号:在一台电脑中,可以运行成百上千个 web服务。每个 web 服务都对应一个唯一的端口号。客户端发送过来的网络请求,通过端口号,可以被准确地交给对应的 web 服务进行处理。每个端口号不能同时被多个 web 服务占用。在实际应用中,URL 中的 80 端口可以被省略,(80 443 3006 )

如果要在 JavaScript 代码中,使用 http模块来操作文件,则需要使用如下的方式先导入它:

const http = require('http');

1. 创建 HTTP 服务器

语法格式:

// 1.导入 http 模块
const http = require('http');

// 2.创建 HTTP 服务器
const server = http.createServer((req, res) => {
  // 处理请求和响应
  // 设置响应头
  res.writeHead(200, { 'Content-Type': 'text/plain' });  // 状态码 200,文本类型
  // 发送响应数据
  res.end('Hello World1');
});

// 3.监听端口
// listen 方法用于启动服务器并监听指定的端口(这里是 3000)。
// 第一个参数是要监听的端口号。
// 第二个参数是一个可选的回调函数,当服务器成功启动并开始监听端口时,这个回调函数会被调用。
// 在这个例子中,回调函数只是在控制台输出一条消息,提示服务器已经在 http://localhost:3000 上运行。
server.listen(3000, () => {
  console.log('Server running on http://localhost:3000');
});

写完代码后,在terminal运行:node 【js文件路径】

node C:\Users\Administrator\Desktop\learning\http.js

然后在浏览器打开http://localhost:3000,如图:
node截图

2. 处理请求和响应

  1. 请求对象 req(request 的缩写):表示客户端的请求对象,包含了关于请求的信息,如请求方法(GET、POST 等)、请求头、请求 URL 等。

req.url: 获取请求路径(如 /api/data)。

req.method: 请求方法(GET、POST 等)。

req.headers: 请求头信息。

req.on(‘data’, callback): 监听请求数据。

req.on(‘end’, callback): 监听请求结束。

  1. 响应对象 res(response 的缩写):表示服务器的响应对象,用于设置响应头和发送响应数据。

res.writeHead(statusCode, headers): 设置响应头。

res.write(data): 发送响应数据。

res.end(): 结束响应。

res.statusCode: 响应状态码。

res.statusMessage: 响应状态消息。

二、进阶用法

1. 路由管理

语法格式:

// 1.导入http模块
const http = require('http');
// 2.创建http服务
const server = http.createServer((req, res) => {
  // 3.获取请求路径和请求方法
  // 这里运用了解构赋值的语法,从 req 对象中提取出 url(请求的路径)和 method(请求的方法)这两个属性。借助这两个属性,服务器就能够依据不同的请求路径和方法来提供不同的响应。
  const { url, method } = req;
  // 4.根据请求路径和请求方法返回不同的响应
  // 若请求的路径是根路径 / 且请求方法为 GET,服务器会通过 res.end() 方法返回字符串 'Home Page' 作为响应。res.end() 方法的作用是结束响应并把数据发送给客户端
  if (url === '/' && method === 'GET') {
    // 返回首页
    res.end('Home Page');
    // 若请求的路径是 /api 且请求方法为 GET,服务器会创建一个包含 data 属性的对象,再使用 JSON.stringify() 方法将其转换为 JSON 字符串,最后通过 res.end() 方法返回该 JSON 字符串作为响应。
  } else if (url === '/api' && method === 'GET') {
    // 返回API数据
    res.end(JSON.stringify({ data: 'API Response' }));
  } else {
    // 若请求的路径和方法不匹配上述任何一种情况,服务器会把响应状态码设置为 404(Not Found),并通过 res.end() 方法返回字符串 'Not Found' 作为响应。
    res.writeHead(404);
    res.end('Not Found');
  }
});

2. 处理 POST 请求

通过这种方式,服务器就能够接收并处理客户端发送过来的数据。

// 这里定义了一个名为 body 的变量,并初始化为一个空数组。这个数组将用于存储从客户端发送过来的数据块(chunk)。
// 在 HTTP 请求中,数据可能会分多个部分(数据块)传输,因此需要一个数组来暂存这些数据块,后续再将它们合并成完整的数据。
let body = [];
// req 是 Node.js 中 HTTP 请求对象,代表客户端发送的请求。
// data 事件会在接收到请求数据时触发,每次触发时会传入一个数据块(chunk)。
// 这里通过监听 data 事件,将每个数据块存入 body 数组中。
req.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  // 'end' 是另一个事件名,表示请求数据已经全部传输完成。此时 body 数组中已经包含了完整的请求数据
  // 最后,通过 Buffer.concat() 方法将 body 数组中的数据块合并成一个完整的 Buffer 对象,再通过 toString() 方法将其转换为字符串。
  body = Buffer.concat(body).toString();
  // 最后,通过 JSON.parse() 方法将字符串转换为对象,再通过 res.end() 方法返回一个包含接收到的数据的字符串。
  const data = JSON.parse(body);
  res.end(`Received: ${data}`);
});

3. 中间件模式

通过 use 函数注册中间件,在处理 HTTP 请求时依次执行这些中间件,直到响应结束或所有中间件执行完毕。

语法格式:

// 1. 定义中间件数组:创建了一个空数组 middlewares,用于存储所有注册的中间件函数。中间件是在请求处理过程中可以执行特定任务的函数,例如日志记录、身份验证等。
const middlewares = [];
// 2. 定义 use 函数:use 函数用于向 middlewares 数组中添加中间件函数。当调用 use 函数并传入一个中间件函数时,该函数会被添加到 middlewares 数组的末尾。
function use(middleware) {
  middlewares.push(middleware);
}
// 3. 创建 HTTP 服务器
const server = http.createServer((req, res) => {
  let idx = 0;
  function next() {
    if (idx < middlewares.length) {
      middlewares[idx++](req, res, next);
    } else {
      // 默认响应
      res.statusCode = 404;
      res.end('Not Found');
    }
  }
  next();
});

// 使用中间件
// 第一个中间件函数 (req, res, next) => { console.log('Middleware 1'); next(); }:当执行到这个中间件时,会在控制台输出 'Middleware 1',然后调用 next 函数,将控制权传递给下一个中间件。
use((req, res, next) => {
  console.log('Middleware 1');
  next();
});
// 第二个中间件函数 (req, res) => { res.end('Hello from Middleware'); }:当执行到这个中间件时,会结束响应并返回 'Hello from Middleware' 给客户端,此时不会再调用 next 函数,因为响应已经结束。
use((req, res) => {
  res.end('Hello from Middleware');
});

三、常见场景

  1. 静态文件服务器:
    创建了一个简单的静态文件服务器,它会根据客户端请求的 URL 尝试从 public 目录下读取对应的文件,并将文件内容返回给客户端。若文件不存在,则返回 404 错误信息。
// 引入 Node.js 的文件系统模块,用于处理文件和目录操作
const fs = require('fs');
// 引入 Node.js 的路径模块,用于处理和转换文件路径
const path = require('path');

// 创建一个 HTTP 服务器实例
const server = http.createServer((req, res) => {
    // 构建要读取的文件的完整路径
    // __dirname 是当前执行脚本所在的目录的绝对路径
    // 'public' 是存储静态文件的目录名
    // req.url 是客户端请求的 URL
    const filePath = path.join(__dirname, 'public', req.url);

    // 异步读取指定路径的文件内容
    fs.readFile(filePath, (err, data) => {
        // 检查读取文件过程中是否出现错误
        if (err) {
            // 如果出现错误,将响应的状态码设置为 404,表示未找到资源
            res.writeHead(404);
            // 向客户端发送错误信息
            res.end('File not found');
        } else {
            // 如果读取成功,将响应的状态码设置为 200,表示请求成功
            res.writeHead(200);
            // 将读取到的文件内容发送给客户端
            res.end(data);
        }
    });
});
  1. 代理服务器:
    接收客户端的请求,然后将请求转发到指定的目标服务器(target-server.com),并将目标服务器的响应返回给客户端。这种代理服务器可以用于多种场景,如负载均衡、缓存、访问控制等。
// 创建一个 HTTP 代理服务器实例
// 当有客户端请求到达时,会触发传入的回调函数进行处理
const httpProxy = http.createServer((req, res) => {
    // 创建一个对目标服务器的 HTTP 请求
    // 第一个参数是一个配置对象,用于指定目标服务器的相关信息
    // host 指定目标服务器的主机名,即要将请求转发到的服务器地址
    // path 直接使用客户端请求的 URL 路径,将其原样转发给目标服务器
    const proxyReq = http.request(
        { host: 'target-server.com', path: req.url },
        // 当从目标服务器接收到响应时,会触发此回调函数
        (proxyRes) => {
            // 将目标服务器的响应流通过管道传输到客户端的响应流
            // 也就是把目标服务器返回的响应内容直接发送给客户端
            proxyRes.pipe(res);
        }
    );

    // 将客户端的请求流通过管道传输到对目标服务器的请求流
    // 这样就把客户端的请求内容(如请求体)转发给目标服务器
    req.pipe(proxyReq);
});
  1. RESTful API:
    在服务器接收到客户端请求时,根据请求的 URL 和请求方法进行不同的处理。如果请求的是 /api/users 且为 GET 请求,服务器会返回所有用户信息;如果请求的是 /api/users/某个用户 ID 且为 GET 请求,服务器会返回该指定用户的信息。
// 定义一个数组 users,用于存储用户信息
// 初始时数组中有一个用户对象,包含用户的 id 和 name
const users = [{ id: 1, name: 'Alice' }];

// 为服务器实例添加 request 事件监听器
// 当服务器接收到客户端的请求时,会触发该监听器中的回调函数
server.on('request', (req, res) => {
    // 检查请求的 URL 是否为 /api/users 且请求方法为 GET
    if (req.url === '/api/users' && req.method === 'GET') {
        // 如果满足条件,将 users 数组转换为 JSON 字符串
        // 并将其作为响应内容返回给客户端
        res.end(JSON.stringify(users));
    } 
    // 检查请求的 URL 是否以 /api/users/ 开头且请求方法为 GET
    else if (req.url.startsWith('/api/users/') && req.method === 'GET') {
        // 从请求的 URL 中提取用户 ID
        // 先使用 split 方法按 / 分割 URL 字符串,然后取索引为 3 的元素
        // 再将其转换为整数类型
        const userId = parseInt(req.url.split('/')[3]);
        // 在 users 数组中查找 id 等于提取的 userId 的用户对象
        const user = users.find(u => u.id === userId);
        // 将找到的用户对象转换为 JSON 字符串并作为响应内容返回给客户端
        res.end(JSON.stringify(user));
    }
});

四、错误处理与安全

  1. 错误处理
    这部分代码为 HTTP 服务器实例 server 添加了一个 error 事件监听器。当服务器在运行过程中遇到错误(例如端口被占用、网络连接问题等)时,会触发这个监听器,并将错误对象 err 作为参数传递给回调函数。在回调函数中,使用 console.error 将错误信息输出到控制台,以便开发者能够及时发现和排查问题。
server.on('error', (err) => {
  console.error('Server error:', err);
});
  1. 超时设置
    server.timeout 属性用于设置服务器的超时时间,单位为毫秒。这里将超时时间设置为 5000 毫秒(即 5 秒)。当一个请求在 5 秒内没有完成处理时,服务器会自动终止该请求,并触发 timeout 事件(如果有相应的事件监听器)。这有助于防止服务器因为处理长时间运行的请求而被阻塞,从而影响其他请求的处理。
server.timeout = 5000; // 5秒
  1. 使用 helmet 库设置安全头:helmet 是一个 Node.js 库,它可以帮助开发者设置一系列 HTTP 响应头,以提高应用程序的安全性。例如,设置 Content-Security-Policy 头可以防止跨站脚本攻击(XSS),设置 X-Frame-Options 头可以防止点击劫持攻击等。通过使用 helmet,可以简化安全头的设置过程,并确保遵循最佳安全实践。

学习方向:安装和使用 helmet 库,了解它提供的各种安全头选项及其作用。深入学习每个安全头的具体含义和配置方法,例如 Content-Security-Policy 的指令语法和 X-Content-Type-Options 的用途。学习如何根据应用程序的具体需求和安全策略来定制 helmet 的配置。

  1. 验证输入数据,防止 SQL 注入或 XSS 攻击:在处理用户输入时,必须对输入数据进行验证和过滤,以防止恶意用户通过输入恶意代码来执行 SQL 注入或 XSS 攻击。例如,在处理数据库查询时,使用参数化查询可以防止 SQL 注入;在输出用户输入到 HTML 页面时,对特殊字符进行转义可以防止 XSS 攻击。

学习方向:学习 SQL 注入的原理和常见的攻击方式,以及如何使用参数化查询、预处理语句等技术来防止 SQL 注入。了解 XSS 攻击的类型(反射型、存储型、DOM 型)及其原理,学习如何对用户输入进行过滤和转义,以及使用内容安全策略来防止 XSS 攻击。探索使用验证库(如 validator.js)来简化输入数据的验证过程。

  1. 限制请求体大小,防止 DDoS 攻击:限制请求体的大小可以防止攻击者通过发送大量数据来耗尽服务器的资源,从而导致拒绝服务(DDoS)攻击。通过设置一个合理的请求体大小限制,服务器可以拒绝过大的请求,保护自身的稳定性和可用性。

学习方向:了解不同的 HTTP 服务器框架(如 Express.js、Koa.js 等)中如何设置请求体大小限制。
研究 DDoS 攻击的类型和原理,以及其他防止 DDoS 攻击的方法,如使用防火墙、负载均衡器等。
学习如何根据服务器的性能和应用程序的需求来确定合适的请求体大小限制。

五、对比 http 与 Express

http 模块是 Node.js 的内置模块,用于创建 HTTP 服务器。
Express 是一个更高级的 HTTP 框架,基于 http 模块封装,提供了更多的特性,使得开发更加便捷。
node截图

六、工具库推荐:

express: 更高级的 HTTP 框架。
axios: 用于发送 HTTP 请求。
nodemon: 开发时自动重启服务器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2320955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实验11 机器学习-贝叶斯分类器

实验11 机器学习-贝叶斯分类器 一、实验目的 &#xff08;1&#xff09;理解并熟悉贝叶斯分类器的思想和原理&#xff1b; &#xff08;2&#xff09;熟悉贝叶斯分类器的数学推导过程&#xff1b; &#xff08;3&#xff09;能运用贝叶斯分类器解决实际问题并体会算法的效果&a…

OpenHarmony子系统开发 - 电池管理(二)

OpenHarmony子系统开发 - 电池管理&#xff08;二&#xff09; 五、充电限流限压定制开发指导 概述 简介 OpenHarmony默认提供了充电限流限压的特性。在对终端设备进行充电时&#xff0c;由于环境影响&#xff0c;可能会导致电池温度过高&#xff0c;因此需要对充电电流或电…

hive 数据简介

Hive介绍 1&#xff09;Hive简介 Hive是基于Hadoop的一个数据仓库工具&#xff0c;用于结构化数据的查询、分析和汇总。Hive提供类SQL查询功能&#xff0c;它将SQL转换为MapReduce程序。 Hive不支持OLTP&#xff0c;Hive无法提供实时查询。 2&#xff09;Hive在大数据生态环境…

Win32桌面编程:ACLUI.DLL,EditSecurity(IntPtr hwndOwner, ISecurityInformation psi)

在Windows编程中&#xff0c;我们通常需要借助通用对话框的力量&#xff0c;今天我们就聊一下“安全属性表”通用对话框的使用心得。 当我们调用EditSecurity函数时&#xff1a; 1.EditSecurity将调用ISecurityInformation中的GetObjectInformation函数 在编写 ISecurityInf…

数据分析异步进阶:aiohttp与Asyncio性能提升

一、时间轴呈现方案进程 2023-04-01&#xff1a;需求确认 确定目标&#xff1a;使用aiohttp与Asyncio提升采集性能&#xff0c;目标采集今日头条网站的新闻数据&#xff08;标题、内容、时间等&#xff09;。同时要求在程序中加入代理IP、Cookie和UserAgent的设置&#xff0c;…

《AI大模型趣味实战 》第8集:多端适配 个人新闻头条 基于大模型和RSS聚合打造个人新闻电台(Flask WEB版) 2

《AI大模型趣味实战 》第8集&#xff1a;多端适配 个人新闻头条 基于大模型和RSS聚合打造个人新闻电台(Flask WEB版) 2 摘要 本文末尾介绍了如何实现新闻智能体的方法。在信息爆炸的时代&#xff0c;如何高效获取和筛选感兴趣的新闻内容成为一个现实问题。本文将带领读者通过P…

低配电脑畅玩《怪物猎人:荒野》,ToDesk云电脑优化从30帧到144帧?

《怪物猎人&#xff1a;荒野&#xff08;Monster Hunter Wilds&#xff09;》自2025年正式发售以来已取得相当亮眼的成绩&#xff0c;仅用三天时间便轻松突破800万销量&#xff0c;目前顺利蝉联周榜冠军&#xff1b;凭借着开放世界的宏大场景和丰富的狩猎玩法&#xff0c;该游戏…

【js逆向入门】图灵爬虫练习平台 第九题

地址&#xff1a;aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvOS8 f12进入了debugger&#xff0c;右击选择一律不在此处暂停&#xff0c; 点击继续执行 查看请求信息 查看载荷&#xff0c;2个加密参数&#xff0c;m和tt 查看启动器&#xff0c;打上断点 进来 往…

NET6 WebApi第5讲:中间件(源码理解,俄罗斯套娃怎么来的?);Web 服务器 (Nginx / IIS / Kestrel)、WSL、SSL/TSL

一、NET6的启动流程 区别&#xff1a; .NET6 WebApi第1讲&#xff1a;VSCode开发.NET项目、区别.NET5框架【两个框架启动流程详解】_vscode webapi-CSDN博客 2、WebApplicationBuilder&#xff1a;是NET6引入的一个类&#xff0c;是建造者模式的典型应用 1>建造者模式的…

Nginx及前端部署全流程:初始化配置到生产环境部署(附Nginx常用命令)

nginx&前端从初始化配置到部署&#xff08;xshell&#xff09; 前言下载nginx前端打包与创建具体文件夹路径配置nginx.nginx.conf文件配置项内容 配置nginx.service文件配置项内容 启动nginx常用nginx命令 前言 目标&#xff1a;在xshell中部署前端包。 第一步&#xff1a…

python 实现一个简单的window 任务管理器

import tkinter as tk from tkinter import ttk import psutil# 运行此代码前&#xff0c;请确保已经安装了 psutil 库&#xff0c;可以使用 pip install psutil 进行安装。 # 由于获取进程信息可能会受到权限限制&#xff0c;某些进程的信息可能无法获取&#xff0c;代码中已经…

【xiaozhi赎回之路-2:语音可以自己配置就是用GPT本地API】

固件作用 打通了网络和硬件的沟通 修改固件实现【改变连接到小智服务器的】 回答逻辑LLM自定义 自定义了Coze&#xff08;比较高级&#xff0c;自定义程度比较高&#xff0c;包括知识库&#xff0c;虚拟脚色-恋人-雅思老师-娃娃玩具{可能需要使用显卡对开源模型进行微调-产…

WX小程序

下载 package com.sky.utils;import com.alibaba.fastjson.JSONObject; import org.apache.http.NameValuePair; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.Cl…

Spring boot 3.4 后 SDK 升级,暨 UI API/MCP 计划

PS 写这篇文章后看到 A Deep Dive Into MCP and the Future of AI Tooling | Andreessen HorowitzWe explore what MCP is, how it changes the way AI interacts with tools, what developers are already building, and the challenges that still need solving. https://a1…

Linux下JDK1.8安装配置

目录 1.下载完上传到Linux系统中 2.解压JDK压缩包 3.配置JDK环境变量 4.设置环境变量生效 5.查看环境变量是否配置成功 官网下载地址:Java Downloads | Oracle 1.下载完上传到Linux系统中 2.解压JDK压缩包 tar -zxvf jdk-8u151-linux-x64.tar.gz -C /usr/local (解压…

Python OCR文本识别详细步骤及代码示例

光学字符识别&#xff08;OCR&#xff09;是将图像中的文字转换为可编辑文本的技术。在Python中&#xff0c;我们可以利用多种库实现OCR功能。本文将详细介绍使用Tesseract和EasyOCR进行文本识别的步骤&#xff0c;并提供完整的代码示例。 一、OCR简介 OCR&#xff08;Optical…

Linux固定IP方法(RedHat+Net模式)

1、查看当前网关 ip route | grep default 2、配置静态IP 双击重启 3、验证

210、【图论】课程表(Python)

题目 思路 这道题本质上是一个拓扑排序。每次先统计每个点的入度个数、然后再统计点与点之间的邻接关系&#xff0c;找到入度为0的点作为起始遍历点。之后每遍历到这个点之后&#xff0c;就把这个点后续的邻接关系边的点入度减去一。当某个点入度为0时&#xff0c;继续被加入其…

跟着StatQuest学知识07-张量与PyTorch

一、张量tensor 张量重新命名一些数据概念&#xff0c;存储数据以及权重和偏置。 张量还允许与数据相关的数学计算能够相对快速的完成。 通常&#xff0c;张量及其进行的数学计算会通过成为图形处理单元&#xff08;GPUs&#xff09;的特殊芯片来加速。但还有张量处理单元&am…

前端字段名和后端不一致?解锁 JSON 映射的“隐藏规则” !!!

&#x1f680; 前端字段名和后端不一致&#xff1f;解锁 JSON 映射的“隐藏规则” &#x1f31f; 嘿&#xff0c;技术冒险家们&#xff01;&#x1f44b; 今天我们要聊一个开发中常见的“坑”&#xff1a;前端传来的 JSON 参数字段名和后端对象字段名不一致&#xff0c;会发生…