fetch 请求数据 以及 node 后端 post请求获取不到数据的记录

本文记录了在使用Fetch API替代axios后,遇到的与Node.js后端进行POST请求时数据获取不到的问题。通过分析,发现GET请求能够通过req.query获取参数,但POST请求需要借助body-parser或formidable来解析POST数据。

axios 用过之后就不想在用了所以就用了fetch


在使用fetch请求由node构建 的服务的时候

    get 请求能沟通过req,query请求过来参数但是post不行

  所以需要引用body-parmr

  或者使用formidable来进行post数据的解析


import formidable from 'formidable';
import timeFormater from 'time-formater';
import server from '../../server/article.js';
import publicJs from '../../prototyoe/public.js'
class articleController{
	constructor(){

	}
	async newArticle(req,res,next){
           const form = new formidable.IncomingForm();
            form.parse(req,async (err,fields , files) => {
                const {title, content,publishTime} = fields;
                  try{
                      if(!title){
                          throw new Error("文章标题不能为空");
                      }else if(!content){
                           throw new Error("文章内容不能为空")
                      }else if(!publishTime){
                           throw new Error("时间不能为空")
                      }
                   }catch(error){
                         res.send({
                            status:0,
                            type:"ERROR_ARTICLE",
                            message:error.message
                           })
                   }
                   try{
                        const article_id = await publicJs.articleId();

                        const Article = {
                             title:title,
                             content:content,
                             publishTime:publishTime,
                             // article_id : article_id
                        }
                        await server.articleDb(Article);
                           res.send({
                              status:1,
                              message:"保存文章成功"
                           })
                   }catch(error){
                        res.send({
                           status:0,
                           message:"保存文章失败"
                        })
                   }
            })
	}
};



但是post请求还是不成功最后才发现是因为在fetch中没有规定请求的数据是json格式的,导致了数据请求不成功


	if (window.fetch && method == 'fetch') {
		let requestConfig = {
			credentials: 'include',
			method: type,
			headers: {
				'Accept': 'application/json', 
				'Content-Type': 'application/json'
			},
			
		}

		if (type == 'POST') {
			Object.defineProperty(requestConfig, 'body', {
				value: JSON.stringify(data)
			})
		}
		
		try {
			const response = await fetch(url, requestConfig);
			const responseJson = await response.json();
			return responseJson
		} catch (error) {
			throw new Error(error)
		}
	} 




<think>首先,用户的问题是:“我想了解前端发起一个API请求后端返回数据的完整流程”。我需要基于提供的引用内容来回答这个问题。引用包括API的基本概念和后端处理流程的细节。 关键引用: - 引用[1]:解释了API是前后端通信的契约,使用RESTful API格式,前端通过调用后端提供的API接口来实现功能。 - 引用[2]:详细描述了后端处理流程,包括前端请求发送、数据校验、AI服务调用、响应验证等步骤。这是一个具体的例子,涉及商品发布流程。 - 引用[3]:提到了Django后端和React前端的开发流程,但不是直接相关,所以我可能不需要过多依赖这个。 用户要求我“尽可能多的参考用户上一次的问题和你的回答”。用户的上一次问题是什么?在系统指令中,用户没有提到上一个问题;只有这个新问题。所以在上下文中,我应该直接回应这个新问题。 既然用户指定了参考站内引用,我必须将这些引用融入到我的回答中。系统指令还说:“回答中引用的段落末尾自然地添加引用标识,例如:[^1]”。所以,当我引用这些内容时,需要在末尾添加引用的脚注。 现在,构建回答的结构: 1. **介绍API请求流程**:基于引用[1],解释前端如何发起API请求。 2. **详细流程步骤**:基于引用[2],描述从请求发送到返回数据的完整过程。 3. **综合流程**:创建一个通用的流程描述,结合引用内容。 4. **结束部分**:自然地添加相关问题。 回答必须: - 使用中文。 - 遵循LaTeX格式:行内表达式用$...$,独立公式用$$...$$(但这个问题可能不需要数学公式)。 - 结构清晰,逐步解决问题。 - 保证真实可靠。 步骤流程: 1. **前端发起请求**:前端通过HTTP方法(如POST或GET)发送请求到指定的API接口。请求包含必要的参数和数据。 2. **后端接收请求**:后端服务器接收请求,根据API定义的契约处理。 3. **数据校验**:后端首先进行数据验证(如格式检查、范围检查)基于引用[2]。 4. **业务逻辑处理**:后端执行核心逻辑,可能涉及数据库操作、服务调用等。 5. **构建响应**:后端处理完成后,构建响应数据(通常为JSON格式)。 6. **返回响应**:后端发送响应给前端。 7. **前端处理响应**:前端接收数据并更新UI。 基于引用[2]的具体流程: - 前端发送POST请求到/api/items/publish。 - 后端执行基础校验(价格范围、描述长度等)。 - 如果校验失败,返回400错误。 - 如果通过,创建草稿,调用AI服务。 - 验证AI响应。 - 如果成功,更新状态,返回200响应。 我需要将此通用化,因为用户的问题是关于完整流程的,而不限于特定例子。 完整流程概述: 1. **请求发送**:前端使用JavaScript(如fetch或axios)发起HTTP请求。 2. **请求传输**:请求通过网络传输到后端服务器。 3. **后端处理**: - 接收请求。 - 校验数据。 - 执行业务逻辑(如数据库操作)。 - 构建响应。 4. **响应返回**:后端发送响应,前端接收并处理。 添加引用标识: - 当提到API契约时,引用引用[1]。 - 当提到具体处理步骤时,引用引用[2]。 最后,生成相关问题: - 基于系统指令,示例中包括了相关问题。所以,我需要添加相关问题部分。 - 问题应引导用户深入理解。 相关问题例子: 1. 如何优化API请求的性能? 2. 常见的API认证机制有哪些? 3. API错误处理的最佳实践是什么? 确保回答真实可靠:我已经从引用中提取了信息,所以保持准确。 </think>以下我将详细介绍前端发起一个API请求后端返回数据的完整流程。这个过程基于Web应用程序的典型架构,分为前端发起请求、网络传输、后端处理、响应构建和前端接收等步骤。我会参考您提供的引用内容,特别是引用[1]和引用[2](引用[3]主要聚焦开发流程,与API请求核心流程关联较少,故较少引用),确保描述真实可靠。整个流程以RESTful API为例,使用HTTP协议和JSON数据格式作为标准。 ### 1. **前端发起请求** 前端(如React或Vue.js应用程序)通过JavaScript代码发起HTTP请求。这通常使用内置API(如Fetch API)或库(如Axios)实现。请求包括: - **API接口地址**:后端的URL端点,例如`/api/items/publish`。 - **HTTP方法**:如GET(查询)、POST(创建)、PUT(更新)或DELETE(删除)。 - **请求参数**: - 查询参数(URL中,如`?userId=123`)。 - 请求体(body)数据,通常为JSON格式,包含必要字段(如书名、价格等)。 - 请求头(headers),包含认证信息(如Bearer Token)、内容类型(如`Content-Type: application/json`)。 例如,前端代码可能如下: ```javascript // 使用Fetch API发送POST请求 fetch('/api/items/publish', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer token123' }, body: JSON.stringify({ title: '算法导论', price: 150, condition: 'new' }) }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('请求失败:', error)); ``` 在这个阶段,前端专注于构建和发送请求,不处理业务逻辑或数据校验(如引用[2]所述:“前端不处理任何业务逻辑或AI相关功能”)[^2]。 ### 2. **网络传输** 请求从前端浏览器通过互联网发送到后端服务器(通常部署在云服务如AWS或本地服务器)。传输过程涉及: - **HTTP协议**:请求被封装为HTTP消息,通过TCP/IP协议传输。 - **负载均衡**:如果后端是多服务器架构,请求可能先经过负载均衡器(如Nginx)分发到特定服务器实例。 - **DNS解析**:前端通过域名解析API地址的IP地址。 这一步确保请求可靠到达后端,但网络延迟或中断可能导致超时错误。 ### 3. **后端接收与初步处理** 后端服务器(如Django、Node.js或Spring Boot应用)接收到请求后立即开始处理: - **路由匹配**:后端框架根据URL和方法路由到对应的控制器或视图函数。 - **基本校验**:后端执行快速数据校验,包括: - 验证请求格式(如JSON合法性)。 - 检查必填字段和参数范围(如价格在10-200元之间、描述长度≤500字符)。 - 认证授权(如验证Token有效性)。 如果校验失败,后端立即返回错误响应(如400 Bad Request状态码),并终止流程(如引用[2]所述:“失败立即返回400状态码并终止流程”)[^2]。否则,进入下一步。 ### 4. **业务逻辑处理** 通过初步校验后,后端执行核心业务逻辑,可能涉及多个子系统: - **数据聚合**:后端服务(如引用[2]中的Agent-Bridge服务)从数据库或其他服务收集上下文数据(如用户信息、同类商品数据)[^2]。 - **服务调用**:后端可能调用内部或外部服务(如AI服务)进行数据处理: - 例如,通过`CozeApiClient`调用AI服务优化描述或风控检查(设置超时控制)。 - **数据库操作**: - 创建或更新数据记录(如创建商品草稿并存储到MySQL数据库,初始状态设为PENDING_AI)。 - 事务管理确保数据一致性。 此阶段强调异步处理和错误恢复(如服务调用失败时重试或回滚)。 ### 5. **响应构建与验证** 处理完成后,后端构建响应数据: - **数据格式**:通常为JSON对象(如`{ "code": 200, "data": { ... } }`)。 - **响应验证**:后端执行多层校验确保响应可靠(如引用[2]所述的多层校验机制): - JSON格式合法性。 - 数据范围检查(如价格在有效区间)。 - 安全性过滤(如敏感词扫描)。 如果验证失败,后端更新状态(如REJECTED)并记录原因;否则,生成成功响应[^2]。 ### 6. **响应返回** 后端通过HTTP响应返回数据: - **状态码**:如200 OK(成功)、201 Created(资源创建)、或错误码(如500 Internal Server Error)。 - **响应头和体**: - 头信息包括内容类型(`Content-Type: application/json`)。 - 体包含结构化数据(如优化后的描述和商品状态)。 响应通过网络返回到前端,整个过程通常在毫秒级完成(受网络和服务性能影响)。 ### 7. **前端接收与处理** 前端接收到响应后: - **解析数据**:前端解析JSON响应(如使用`response.json()`提取数据)。 - **错误处理**:检查状态码(非200时显示错误提示)。 - **UI更新**:基于响应数据更新用户界面(如显示成功消息或商品列表)。 例如,前端代码处理响应后可能渲染新组件: ```javascript // 处理成功响应 function handleResponse(data) { if (data.code === 200) { console.log('商品上架成功:', data.data.itemId); // 更新UI状态 } else { console.error('错误:', data.message); } } ``` ### 总结 整个流程的核心是“契约式通信”:前端按照API定义发起请求后端处理逻辑并返回数据(如引用[1]所述:“前后端之间通过API的契约进行通信”)[^1]。理想情况下,流程高效且可靠,但实际中可能涉及优化(如缓存、异步队列)以处理高并发。RESTful API的标准设计(HTTP方法+JSON)确保了通用性和清晰度[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值