You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native使用res.text()解析Node.js返回长字符串报错原因咨询

问题根因分析

该报错本质是代码尝试修改被Object.freeze冻结的不可变对象,报错中提到的_V是React Native内置Promise实现的内部状态字段,用于标记Promise是否已完成状态变更。触发res.text()报错的核心原因有以下几个:

  1. 基础语法错误:示例代码中let res = fetch(url)缺少await关键字,此时拿到的res是未决议的Promise实例而非fetch返回的Response对象,对Promise实例直接调用.text()方法会触发内部状态修改逻辑,恰好命中被冻结的Promise内部属性限制。
  2. 响应头配置问题:如果Node服务端返回长字符串时没有正确设置Content-Type: text/plain; charset=utf-8响应头,React Native的fetch实现会尝试自动识别内容类型,在处理超长纯文本时会走异常的解析路径,触发内部冻结对象的属性修改。
  3. 全局对象冻结冲突:如果项目中引入的状态管理库(如Redux、MobX)开启了开发模式下的对象冻结校验,或者自定义了全局fetch拦截器、Response原型修改逻辑,会意外将fetch返回的Response实例冻结,而res.text()的内部实现需要给Response实例挂载临时私有属性存储解码结果,就会触发该报错。而res.json()的解析逻辑不需要修改Response实例的自有属性,所以不会触发冲突。
  4. 超长文本解码异常:当返回的长字符串长度超过React Native fetch默认的流式解析缓冲区大小,或者字符串中包含不符合UTF-8编码规范的字节序列时,res.text()的UTF-8解码过程会抛出异常,异常的抛出逻辑会意外触发对内部冻结Promise实例的状态修改。
可行解决方案
  • 修正fetch调用逻辑,添加await关键字确保拿到的是Response实例:let res = await fetch(url)
  • 给Node服务端的纯文本响应添加正确的响应头:return res.status(200).set('Content-Type', 'text/plain; charset=utf-8').send(longString)
  • 排查项目中的全局对象冻结逻辑,排除Response实例被意外冻结的情况
  • 若确认为超长文本解码问题,可以将服务端的长字符串做Base64编码后返回,前端解码拿到原始文本,绕开res.text()的解析异常
  • 改用XMLHttpRequest直接拉取文本内容,绕开React Native fetch实现的兼容问题

内容的提问来源于stack exchange,提问作者user938363

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:27:03