Skip to content
当前位置:🏠 首页  / 文章归档 / 2025

边缘函数操作请求主体

发布时间:2025-12-13 04:52

记录一下本次遇到的问题和最终解决办法。

发现问题

我前端通过fetch发送数据,使用post方法,把一个数组转为json字符串,然后设置body为这个json字符串,请求到edgeone pages的边缘函数。

然后问题出现了,我直接把这个const body = context.request.body;输出的话,好像没有问题。

但是,一旦对这个值进行任何一次操作,最后输出的就是一个空对象。

我最开始没发现,还以为是官方出了bug。具体过程不说了,我没有调试工具,全是手机编辑代码,上传代码仓库,然后执行,修改,再执行,搞了一天,最后才发现的。

原因

最终原因,因为请求主体是一个流,只能读取一次,任何二次读取都会变成空对象。比如用一个变量引用它,这时候就自动读取了一次,然后这个变量进行任何一点修改,就会再次读取它,导致结果变成空对象,

解决办法

最终解决办法,在读取它之前,先用clone方法克隆对象,然后再操作克隆的变量,如下方示例,我的请求主体是一个数组转成的json字符串,先克隆,然后把json字符串直接转为新的数组。再次操作这个数组就没问题了,

js
const clonedRequest = context.request.clone();
const body = await clonedRequest.json();

类似于收到了一封信,阅后即焚的那种,如何安全的查看和处理呢,办法就是先复制一份,然后操作复制的那份。

但是,js默认的赋值语句都是添加索引而不是复制,这和php正好相反,所以必须使用手动复制的方法。