将Twitter API获取的Tweet对象存入Firestore时遇数组转换错误求助
解决Firestore保存Tweet对象时的"Invalid Argument: Cannot convert an array value in an array value"错误
我之前也碰到过一模一样的问题,很快就能定位到原因!Firestore不支持存储嵌套数组(也就是数组里再嵌套数组的结构),而你提供的Tweet对象里刚好存在这样的结构——就是place.bounding_box.coordinates这个二维数组:
[[[-74.026675,40.683935],[-73.910408,40.683935],[-73.910408,40.877483],[-74.026675,40.877483]]]
这就是触发错误的核心,下面给你两种简单可行的解决方案:
方案一:将嵌套数组序列化为字符串(最简便)
把嵌套数组转成JSON字符串存入Firestore,读取时再解析回来即可,完全不影响后续数据使用。以JavaScript为例,写个批量处理的函数:
// 单个Tweet对象的预处理函数 function formatTweetForFirestore(tweet) { // 检查并处理bounding_box的嵌套数组 if (tweet.place?.bounding_box?.coordinates) { tweet.place.bounding_box.coordinates = JSON.stringify(tweet.place.bounding_box.coordinates); } // 后续如果有其他嵌套数组字段,也可以在这里添加处理逻辑 return tweet; } // 批量处理你的threads数组 const readyToSaveThreads = threads.map(tweet => formatTweetForFirestore({...tweet})); // 现在就可以把readyToSaveThreads存入Firestore了
方案二:将嵌套数组转换为对象结构(适合需直接操作数据的场景)
如果你不想用字符串序列化,也可以把二维数组拆成Firestore支持的对象结构,比如把多边形坐标拆成顶点列表:
function formatTweetForFirestore(tweet) { if (tweet.place?.bounding_box?.coordinates) { // 把二维数组转换成包含顶点列表的对象 tweet.place.bounding_box.coordinates = { vertices: tweet.place.bounding_box.coordinates[0] }; } return tweet; }
额外检查提示
除了bounding_box.coordinates,你可以再确认下其他字段:contained_within是空数组,Firestore是支持的;display_text_range是一维数组,也没问题。只需要重点处理多维数组的情况就行。
内容的提问来源于stack exchange,提问作者yashatreya
相关产品推荐
相关产品推荐

