主题
边缘函数操作请求主体
发布时间: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正好相反,所以必须使用手动复制的方法。