解决node.js的req.body为空的问题
从昨晚一直在试,明明之前用的封装的axios发送请求给其他的后端(springboot)是可以的,但昨天用了新项目的后端(node.js)就不行。
之前用了代理,所以浏览器发送的post请求不会被拦截,但是昨天因为项目的接口没有统一前缀的原因(比如都用admin)开头,所以直接把baseUrl写成http://127.0.0.1:7123了,但是发送post请求出错,我还以为前端写错了,后面发现post请求的话总不行,报是跨域的问题,但是get的话就可以,查了一下,get的话请求参数会被放在query里面,post请求会跨域,所以node那边得写成 res.header("Access-Control-Allow-Headers", "X-Requested-With,Content-Type");原来的话是 res.header("Access-Control-Allow-Headers", "X-Requested-With")
解决跨域问题的写法:(记得加Content-Type)
res.header("Access-Control-Allow-Headers", "X-Requested-With,Content-Type");
总结,如果post用application/x-www-form-urlencoded,得格式化数据
// 2. 使用 URLSearchParams 格式化数据const formData = new URLSearchParams();for (const key in data1) {formData.append(key, data1[key]);}// 3. 发送 POST 请求axios.post('http://127.0.0.1:7123/admin/login', formData, {headers: {'Content-Type': 'application/x-www-form-urlencoded',},})
如果post用json,则不用,因为axios会自动帮我们json化
const data1 = {account: 'value1',password: 'value2'};// 2. 使用 URLSearchParams 格式化数据const formData = new URLSearchParams();for (const key in data1) {formData.append(key, data1[key]);}// 3. 发送 POST 请求axios.post('http://127.0.0.1:7123/admin/login', data1, {headers: {'Content-Type': 'application/json',},})
上面的例子是不封装的情况,如果是封装的话,如果传进来dataType:"json"格式,按照以下代码可以执行,因为这时候Content-Type为application/json,后端用req.body可以获取到
import axios from "axios"
import { ElLoading } from 'element-plus'; // 正确的拼写是 ElLoading,不是 Lloading
import router from '@/router'
import Message from '../utils/Message'
import { getCurrentInstance } from "vue";
const contentTypeForm='application/x-www-form-urlencoded;charset-UTF-8'
const contentTypeJson='application/json'
const contentTypeMulti ='multipart/form-data'
let loading=null;
import VueCookies from 'vue-cookies';
const instance=axios.create({baseURL:'http://127.0.0.1:7123', //请求后端接口的baseUrltimeout:10*1000, //设置请求的超时时间
})
//请求前拦截器
instance.interceptors.request.use((config)=>{const data= VueCookies.get("loginInfo");if(data){const token=data.token;if (token) {config.headers.token = token}}if(config.showLoading){loading=ElLoading.service({lock:true,text:'加载中……',background:'rgba(0,0,0,0.7)',})}return config;},(error)=>{if(config.showLoading&&loading){loading.close();}Message.error("请求发送失败");return Promise.reject("请求发送失败");}
);
//请求后拦截器
instance.interceptors.response.use((response)=>{const{showLoading,errorCallback,showError=true}=response.config;if(showLoading&&loading){loading.close();}//正常请求if (response.status==200){return response.data;}},(error)=>{const { showLoading, errorCallback, showError = true } = error.config;if (showLoading && loading) {loading.close();}(error.response);if(error.response){const responseData = error.response;if (responseData.status == 401) {setTimeout(() => {router.push("/login")}, 2000);return Promise.reject({ showError: true, msg: "登录超时" });}}if(error.config.showLoading&&loading){loading.close();}return Promise.reject({showError:true,msg:"网络异常"})}
);
const request = ({ url, method, params, dataType, showLoading = true, errorCallback, showError = true, data }) => {// 设置默认 Content-Typeconst contentType = method === 'upload' ? contentTypeMulti : (dataType === 'json' ? contentTypeJson : contentTypeForm);// 处理请求数据const requestData = method === 'upload' ? { data } : (method === 'get' || method === 'delete' ? { params } : { data: params });// 上传请求强制使用 POST 方法if (method === 'upload') {method = 'post';}return instance.request({method,url,...requestData,headers: {'Content-Type': contentType,'X-Requested-With': 'XMLHttpRequest',},showLoading,}).catch(error => {console.error(error);if (showError) {Message.error(error.msg || 'An error occurred');}if (errorCallback) {errorCallback(error);}return null;});
};export default request;
但是如果不传入dataType的话,默认为application/x-www-form-urlencoded的话,就要注意了,
const requestData = method === 'upload' ? { data } : (method === 'get' || method === 'delete' ? { params } : { data: params });这行代码得改为 const requestData = method === 'upload' ? { data } : (method === 'get' || method === 'delete' ? { params } : { params });因为application/x-www-form-urlencoded是以 类似‘name=edward&age=25’ 这样的形式放在参数中,后端得用req.query才能获取数据,req.body获取不到。
但是如果要在req.body获取得到的话,那么
import qs from 'qs';const request = axios.create({baseURL: process.env.BASE_URL,headers: {'Content-Type': 'application/x-www-form-urlencoded',}
})request.interceptors.request.use(config => {if (config.method === 'post') {config.data = qs.stringify(config.data)}return config;
})
记得要qs序列化。!!!!!!!!!!!!!!!!!!!!!!!!!
暂时先写这么多,后续有更清晰的理解再补充,哪里写错还请路过的大佬斧正。
贴一下原贴
post请求头设置成application/json时的跨域错误_指定contenttype为json后报跨域-CSDN博客
相关文章:
解决node.js的req.body为空的问题
从昨晚一直在试,明明之前用的封装的axios发送请求给其他的后端(springboot)是可以的,但昨天用了新项目的后端(node.js)就不行。 之前用了代理,所以浏览器发送的post请求不会被拦截,…...
Mysql学习笔记之安装
“工欲善其事,必先利其器”,这篇文章我们主要介绍Msql的安装方法。 1. 通过Docker方式安装Mysql 通过dock可以很方便的安装mysql,可以通过图形化界面配置各种参数,简介明了推荐使用dock方式安装,当然也可以使用命令方…...
将PDF流使用 canvas 绘制然后转为图片展示在页面上(二)
将PDF流转为图片展示在页面上 使用 pdfjs-dist 库来渲染 PDF 页面到 canvas 上,然后将 canvas 转为图片 安装 pdfjs-dist 依赖 npm install pdfjs-dist 或者 yarn add pdfjs-dist创建一个组件来处理 PDF 流的加载和渲染 该组件中是一个包含 PDF 文件的 ArrayBuffer…...
【深度学习】 零基础介绍卷积神经网络(CNN)
零基础介绍 卷积神经网络(CNN,Convolutional Neural Network)是深度学习中的一种神经网络,特别擅长处理图像和视频等有空间结构的数据。 假设我们在做一个“照片分类”的任务,比如判断一张照片中是猫还是狗。下面用一…...
Coze概述
### Coze概述 Coze(中文名为扣子)是由字节跳动开发的一个新一代AI应用开发平台,旨在让用户轻松创建各种AI驱动的应用和聊天机器人,无论用户的编程经验如何。以下是Coze的一些关键特性和功能: #### 关键特性 - **无代…...
康佳Android面试题及参考答案(多张原理图)
JVM 内存分布和分代回收机制是什么? JVM 内存主要分为以下几个区域。 堆(Heap)是 JVM 管理的最大的一块内存区域,主要用于存放对象实例。所有线程共享堆内存,在堆中又分为年轻代(Young Generation)和老年代(Old Generation)。年轻代又分为 Eden 区和两个 Survivor 区(…...
2022 年 3 月青少年软编等考 C 语言四级真题解析
目录 T1. 拦截导弹思路分析T2. 神奇的数列思路分析T3. 硬币思路分析T4. 公共子序列思路分析T1. 拦截导弹 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的…...
关于24年408真题的疑问
45.某计算机按字节编址,采用页式虚拟存储管理方式,虚拟地址和物理地址的长度均为32位,页表项的大小为4字节,页大小为4MB。虚拟地址结构如下: 这一道题如果不细想的话,其实是可以做对的,毕竟数字…...
【容器】k8s学习笔记基础部分(三万字超详细)
概念 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署在物理机上 优点:简单,不需要其它技术的参与 缺点:不能为应用程序定义资源使…...
dayjs(2kb)和momentjs(70kb)关系详述及项目中如何选择讲解
关系 API:Day.js被设计为Moment.js的极简替代品,其API和用法与Moment.js几乎完全一致。这使得开发者在两者之间进行切换时,学习成本极低。 理念: Moment.js是一个大而全的时间日期库,提供了丰富的日期时间操作方法&am…...
【Python网络爬虫笔记】11- Xpath精准定位元素
目录 一、Xpath 在 Python 网络爬虫中的作用(一)精准定位元素(二)应对动态网页(三)数据结构化提取 二、Xpath 的常用方法(一)节点选取(二)谓词筛选࿰…...
6.python列表
Python 列表 (List) 深度总结 文章目录 Python 列表 (List) 深度总结1. 列表的基本概念2. 访问列表中的元素3. 修改列表4. 删除列表元素5. 列表的操作符6. 列表的内置函数7. 列表的方法8. 列表的高级用法8.1 列表推导式 (List Comprehensions)8.2 列表的浅拷贝与深拷贝8.3 列表…...
Android中bindService和startService启动服务有何区别
Android中bindService和startService启动服务有何区别 bindService 和 startService 是 Android 中两种用于与 Service 交互的方式,它们的区别主要在于 生命周期管理 和 使用场景。以下是详细对比: 1. bindService方式 bindService 是一种绑定方式&am…...
超牛免费 机械臂模型、工业机器人模型下载网站集合
机械臂是一种高精度、多输入多输出的复杂系统,能够模仿人手的动作,按照给定程序、轨迹和要求实现自动抓取、搬运等功能。它通常由执行机构、驱动装置、控制系统以及传感器等组成,能够完成各种复杂的动作。 机械臂在工业、医学、娱乐、…...
引领未来的变革:15种前沿RAG技术及其应用探索
在现代人工智能领域,检索增强生成(RAG)技术逐渐成为推动各种应用的重要力量。这些技术通过结合信息检索与文本生成,能够更有效地处理和利用信息。本文将详细介绍15种前沿RAG技术及其具体应用实例,以帮助您更好地理解这…...
Scala泛型应用场景
Scala中的泛型(Generics)是一种强大的工具,允许开发者编写可重用的代码,同时保持类型安全。泛型在Scala中有多种应用场景,以下是一些常见的应用场景: 集合类: Scala的集合类(如List…...
AI监控赋能健身馆与游泳馆全方位守护,提升安全效率
一、AI视频监控技术的崛起 随着人工智能技术的不断发展,AI视频监控正成为各行业保障安全、提升效率的关键工具。相比传统监控系统,AI技术赋予监控系统实时分析、智能识别和精准预警的能力,让“被动监视”转变为“主动防控”。 二、AI监控应用…...
Avalonia实战实例二:添加三种状态的Svg图片按钮
文章目录 一、Avalonia和WPF中Style的不同1、Avalonia中舍弃了触发器2、Avalonia中Style不再使用x:Key命名区分二、使用Svg图片控件三、实现三种状态的按钮1、使用转换器2、伪类选择接着上一篇:使用Prism创建项目,并创建窗口 这一篇主要是添加: 两个Svg图片按钮,并包含三种…...
基于注意力的几何感知的深度学习对接模型 GAABind - 评测
GAABind 作者是苏州大学的生物基础与医学院, 期刊是 Briefings in Bioinformatics, 2024, 25(1), 1–14。GAABind 是一个基于注意力的几何感知蛋白-小分子结合模式与亲和力预测模型,可以捕捉小分子和蛋白的几何、拓扑结构特征以及相互作用。使用 PDBBind2020 和 CASF2016 作…...
arcGIS使用笔记(无人机tif合并、导出、去除黑边、重采样)
无人机航拍建图之后,通过大疆智图软件可以对所飞行的区域的进行拼图,但是如果需要对拼好的图再次合并,则需要利用到arcGIS软件。下面介绍arcGIS软件在这个过程中常用的操作。 1.导入tif文件并显示的方法:点击“”图标进行导入操作…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
