ArangoDB.js处理超1000条数据时调用cursor方法报'expecting POST /_api/cursor'错误的求助
ArangoDB.js处理超1000条数据时调用cursor方法报'expecting POST /_api/cursor'错误的求助
这个问题大概率是驱动版本和ArangoDB版本不兼容导致的,我来给你拆解原因和解决方案:
核心原因
你用的ArangoDB.js 8.6.0是为ArangoDB 3.10及以上版本设计的,而你的数据库是3.7.6——这两个版本的API交互逻辑有差异,尤其是当需要拉取超过默认batch size(1000条)的数据时,驱动发送的HTTP请求方法不符合旧版数据库的要求,才会抛出expecting POST /_api/cursor错误。
解决方案
方案1:降级驱动到适配版本(最稳妥)
ArangoDB.js的版本和数据库版本是严格匹配的:
- 3.5-3.8版本的ArangoDB对应6.x系列的驱动
- 3.8-3.10对应7.x系列
- 3.10+才用8.x系列
所以你可以卸载当前驱动,安装适配3.7的版本:
npm uninstall arangojs npm install arangojs@6
重新运行代码后,cursor.all()和cursor.fullCount()应该就能正常工作了。
方案2:强制驱动使用POST请求(临时 workaround)
如果暂时不想降级驱动,可以在创建Database实例时添加forcePost: true配置,强制所有API请求用POST方法,匹配ArangoDB 3.7的要求:
const Database = require('arangojs').Database; let db = new Database({ url: 'HTTP://127.0.0.1:8529', databaseName: 'TEST', auth: { username: 'root', password: 'test' }, forcePost: true // 新增这个配置 }); let cursor = await db.query('FOR doc1 IN FOICU RETURN { "CU_NAME": doc1.CU_NAME }'); let result = await cursor.all(); return result;
方案3:手动分批获取数据(兜底方案)
如果上面两种方法都不生效,可以放弃cursor.all(),改用cursor.next()循环拉取每个批次的数据:
const Database = require('arangojs').Database; let db = new Database({ url: 'HTTP://127.0.0.1:8529', databaseName: 'TEST', auth: { username: 'root', password: 'test' } }); let cursor = await db.query('FOR doc1 IN FOICU RETURN { "CU_NAME": doc1.CU_NAME }'); let allResults = []; // 循环拉取每个batch while (true) { const batch = await cursor.next(); if (!batch || batch.length === 0) break; allResults.push(...batch); } return allResults;
另外,如果你需要全量计数,记得在查询里加上OPTIONS { fullCount: true },再通过cursor.fullCount获取:
let cursor = await db.query('FOR doc1 IN FOICU OPTIONS { fullCount: true } RETURN { "CU_NAME": doc1.CU_NAME }'); console.log('全量数据条数:', cursor.fullCount);
备注:内容来源于stack exchange,提问作者Doug Garno
相关产品推荐
相关产品推荐

