React中Appwrite集合文档批量下载仅获取26个的问题
解决Appwrite集合全量文档下载问题
问题根源是Appwrite的listDocuments接口默认采用分页机制,单次请求最多返回25条文档(可通过limit参数调整上限至100),你的代码仅获取了第一页数据,因此只能下载部分文档。要获取全部1000个文档,需要循环分页请求所有数据后再合并下载。
修改后的完整代码
import React from 'react'; import { Databases, Client } from 'appwrite'; const appwrite = new Client(); appwrite .setEndpoint('https://cloud.appwrite.io/v1') .setProject('your-project-id'); const database = new Databases(appwrite); const DATABASE_ID = 'your-database-id'; const BATCH_LIMIT = 100; // 每次请求最大文档数,Appwrite允许上限为100 async function dumpCollection(collectionId) { try { let allDocuments = []; let offset = 0; let hasMoreDocuments = true; while (hasMoreDocuments) { // 分页请求文档 const response = await database.listDocuments( DATABASE_ID, collectionId, [], // 查询条件,无需求则留空数组 BATCH_LIMIT, offset ); allDocuments = [...allDocuments, ...response.documents]; offset += BATCH_LIMIT; // 判断是否还有剩余文档:返回数量小于请求的limit则代表已到最后一页 hasMoreDocuments = response.documents.length === BATCH_LIMIT; } // 生成并下载JSON文件 const json = JSON.stringify(allDocuments, null, 2); const blob = new Blob([json], { type: 'application/json' }); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = `${collectionId}_full_dump.json`; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(url); // 释放临时URL,避免内存泄漏 } catch (error) { console.error(`下载失败: ${error.message}`); alert(`下载失败,请查看控制台日志`); } } const App = () => { return ( <button onClick={() => dumpCollection('your-collection-id')}> 下载全部文档 </button> ); } export default App;
关键修改说明
- 分页循环逻辑:通过
offset(偏移量)和BATCH_LIMIT(单次请求数量)循环调用接口,逐步获取所有分页的文档数据。 - 数据合并:将每一页返回的文档合并到同一个数组中,确保最终包含全部文档。
- 资源清理:调用
URL.revokeObjectURL(url)释放临时创建的URL对象,避免浏览器内存泄漏。 - 错误提示:增加alert弹窗提示下载失败,提升用户感知。
内容的提问来源于stack exchange,提问作者Prasad
相关产品推荐
相关产品推荐

