将entities设为structuredData时出现Cannot perform 'get' on a proxy that has been revoked错误
解决 'Cannot perform 'get' on a proxy that has been revoked' 错误
问题场景
当前代码中,bulkWatchPayload 函数返回对象的 entities 字段赋值为 requestIds 时可正常运行,但改为赋值映射生成的 structuredData 数组时,触发错误:Cannot perform 'get' on a proxy that has been revoked。已知 requestIds = [123,345,1231,3423],structuredData 是通过 requestIds 与 currentView 拼接生成的字符串数组。
相关代码
export const bulkWatchPayload = (requestIds = [], currentView) => { const structuredData = requestIds.map( (requestId) => `ukca_${requestId}_${currentView}` ) return { userId: getCurrentUserEmailId(), correlationId, entityType: `ukca-list-view-page`, entities: requestIds // 替换为structuredData即报错 } }
socket.emit( SocketEvents.REPLACE_WATCH, bulkWatchPayload(e.data.requestIds, e.data.currentView) )
原因分析
这个错误的核心是代码尝试访问一个已被**撤销(revoked)**的Proxy对象,大概率是以下情况:
e.data本身是Proxy实例,调用bulkWatchPayload后该Proxy被提前销毁或撤销structuredData的生成过程依赖了Proxy对象的属性,后续Proxy失效导致访问触发错误
解决方案
1. 提前提取数据,脱离Proxy引用
先把 e.data 中的数据解构或复制出来,再传入函数,避免直接操作Proxy对象:
// 解构提取或浅拷贝,切断与原Proxy的关联 const { requestIds, currentView } = e.data; const safeRequestIds = [...requestIds]; socket.emit( SocketEvents.REPLACE_WATCH, bulkWatchPayload(safeRequestIds, currentView) )
2. 在函数内部复制输入数据
在 bulkWatchPayload 内部对传入的 requestIds 做一次拷贝,确保生成的 structuredData 不依赖原Proxy:
export const bulkWatchPayload = (requestIds = [], currentView) => { // 浅拷贝数组,脱离原Proxy引用 const safeIds = [...requestIds]; const structuredData = safeIds.map( (requestId) => `ukca_${requestId}_${currentView}` ) return { userId: getCurrentUserEmailId(), correlationId, entityType: `ukca-list-view-page`, entities: structuredData } }
3. 检查correlationId的来源
注意代码中 correlationId 未在函数内部定义,如果它同样来自 e.data 或其他Proxy对象,也可能引发类似问题,建议确认其取值是否脱离了Proxy引用,必要时同样做复制处理。
内容的提问来源于stack exchange,提问作者C09-G
相关产品推荐
相关产品推荐

