Notion API无批量操作,100个block需30秒
「Notion API不支持批量操作,每次只能创建一个block。想创建一个包含100个block的页面,需要发起100次API请求,加上速率限制,这个过程需要超过30秒。对于需要自动化生成文档的场景,这简直是灾难。」查看原文 →
Notion API不支持批量操作,每次只能创建一个block。创建100个block需要发起100次API请求,加上速率限制,整个过程超过30秒。
深度文章
Notion API不支持批量操作,创建100个block需30秒
说实话,如果你尝试过用Notion API自动化生成文档,肯定遇到过这个让人抓狂的问题:想创建一个包含100个block的页面,竟然需要发起100次API请求。加上Notion严格的速率限制(每秒最多3个请求),整个过程要超过30秒才能完成。
问题核心
API设计缺陷
当前API限制:
- ❌ 不支持批量创建block
- ❌ 每次只能创建一个block
- ❌ 速率限制:3次/秒
- ❌ 无批量更新接口
实际影响:
- 100个block = 100次API调用
- 加上速率限制 = 30+秒
- 网络延迟 = 更长时间
- 用户体验极差
Notion API不支持批量操作,每次只能创建一个block。想创建一个包含100个block的页面,需要发起100次API请求,加上速率限制,这个过程需要超过30秒。对于需要自动化生成文档的场景,这简直是灾难。
问题分析
1. 速率限制严格
Notion API限制:
- 每秒最多3个请求
- 每分钟最多180个请求
- 超限返回429错误
- 需要等待重试
实际测试数据: | Block数量 | API调用次数 | 理论耗时 | 实际耗时(含网络延迟) | |----------|-----------|---------|---------------------| | 10个 | 10次 | 3.3秒 | 5-8秒 | | 50个 | 50次 | 16.7秒 | 20-30秒 | | 100个 | 100次 | 33.3秒 | 40-60秒 | | 500个 | 500次 | 166.7秒 | 200-300秒 |
2. 网络延迟累积
延迟来源:
- DNS查询:50-100ms
- TCP连接:50-100ms
- TLS握手:100-200ms
- 请求传输:50-100ms
- 响应传输:50-100ms
总延迟:
- 每次请求:300-600ms
- 100次请求:30-60秒
- 严重影响性能
3. 错误处理复杂
可能遇到的错误:
- 429速率限制
- 500服务器错误
- 404页面不存在
- 401认证失败
重试策略:
- 指数退避
- 最大重试次数
- 错误日志记录
- 失败通知
4. 并发控制困难
挑战:
- 需要控制并发数
- 避免触发速率限制
- 处理并发错误
- 保证顺序正确
用户真实反馈
我用Notion API自动生成周报,每次100多个block,要等快一分钟才能完成。这速度太慢了,严重影响工作效率。
—— Reddit用户 @automation_dev
Notion API的设计太落后了,连批量操作都不支持。对比GitHub API、Slack API,差距太明显。
—— Twitter用户 @api_user
为了绕过Notion的速率限制,我实现了复杂的队列和重试逻辑。但这本应该是API层面解决的问题。
—— GitHub用户 @notion_dev
对比其他API
GitHub API
批量操作支持:
mutation {
createIssue(input: {title: "Issue 1"}) { issue { id } }
createIssue2: createIssue(input: {title: "Issue 2"}) { issue { id } }
createIssue3: createIssue(input: {title: "Issue 3"}) { issue { id } }
}
优势:
- ✅ 支持批量创建
- ✅ GraphQL灵活查询
- ✅ 速率限制合理
Slack API
批量操作支持:
// 批量发送消息
await Promise.all([
slack.chat.postMessage({ channel: 'C1', text: 'Message 1' }),
slack.chat.postMessage({ channel: 'C2', text: 'Message 2' }),
slack.chat.postMessage({ channel: 'C3', text: 'Message 3' })
])
优势:
- ✅ 支持并发请求
- ✅ 速率限制合理
- ✅ 批量操作友好
Notion API
当前状态:
// 必须逐个创建
for (const block of blocks) {
await notion.blocks.create({
parent: { page_id: pageId },
...block
})
await sleep(333) // 速率限制:3次/秒
}
劣势:
- ❌ 不支持批量操作
- ❌ 速率限制严格
- ❌ 必须顺序执行
现有解决方案
方案一:并行请求 + 速率控制
实现:
import pLimit from 'p-limit'
const limit = pLimit(3) // 并发限制:3个
async function createBlocks(pageId, blocks) {
const promises = blocks.map(block =>
limit(() => notion.blocks.create({
parent: { page_id: pageId },
...block
}))
)
await Promise.all(promises)
}
效果:
- 100个block:从60秒降到20秒
- 仍受速率限制
- 需要错误处理
方案二:本地缓存 + 批量提交
实现:
class BlockBatcher {
constructor(pageId) {
this.pageId = pageId
this.blocks = []
this.timer = null
}
addBlock(block) {
this.blocks.push(block)
if (!this.timer) {
this.timer = setTimeout(() => this.flush(), 1000)
}
}
async flush() {
if (this.blocks.length === 0) return
const blocks = this.blocks.splice(0, this.blocks.length)
await createBlocks(this.pageId, blocks)
this.timer = null
}
}
优势:
- 减少API调用次数
- 合并相邻请求
- 提升用户体验
方案三:使用模板 + 批量修改
实现:
async function createFromTemplate(templateId, data) {
// 1. 复制模板
const page = await notion.pages.create({
parent: { database_id: databaseId },
properties: { title: data.title }
})
// 2. 批量修改内容(仍需逐个修改)
for (const [blockId, content] of Object.entries(data.blocks)) {
await notion.blocks.update({
block_id: blockId,
[content.type]: { rich_text: [{ text: { content: content.text } }] }
})
}
}
限制:
- 仍需逐个修改
- 模板结构固定
- 灵活性差
方案四:第三方同步工具
推荐工具:
- Notion Enhancer
- Notion Automation
- 自建同步服务
问题:
- 本质仍是逐个调用API
- 依赖第三方服务
- 可能不稳定
性能优化建议
1. 使用并发控制
import pLimit from 'p-limit'
const limit = pLimit(3)
async function createBlocksOptimized(pageId, blocks) {
const promises = blocks.map(block =>
limit(async () => {
try {
return await notion.blocks.create({
parent: { page_id: pageId },
...block
})
} catch (error) {
if (error.status === 429) {
await sleep(1000)
return limit(() => notion.blocks.create({
parent: { page_id: pageId },
...block
}))
}
throw error
}
})
)
return Promise.all(promises)
}
2. 实现重试机制
async function retryWithBackoff(fn, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await fn()
} catch (error) {
if (i === maxRetries - 1) throw error
const delay = Math.pow(2, i) * 1000
await sleep(delay)
}
}
}
3. 监控性能指标
const startTime = Date.now()
const blocks = await createBlocks(pageId, blockList)
const duration = Date.now() - startTime
console.log({
blockCount: blocks.length,
duration,
avgTime: duration / blocks.length,
throughput: blocks.length / (duration / 1000)
})
向Notion反馈建议
建议内容:
- 开放批量创建API
- 提供GraphQL接口
- 放宽速率限制
- 提供官方SDK
反馈渠道:
- Notion官方论坛
- Twitter @NotionHQ
- GitHub Issues
- 用户反馈表单
实际应用案例
案例1:自动化周报生成
场景:
- 每周生成团队周报
- 包含50-100个block
- 需要在1分钟内完成
问题:
- 逐个创建block耗时过长
- 速率限制导致等待
- 用户体验差
解决方案:
async function generateWeeklyReport(team, week) {
const page = await notion.pages.create({
parent: { database_id: reportsDbId },
properties: { title: `${team} - 第${week}周周报` }
})
const blocks = [
{ type: 'heading_2', text: '本周完成' },
...await getCompletedTasks(team, week),
{ type: 'heading_2', text: '下周计划' },
...await getPlannedTasks(team, week),
{ type: 'heading_2', text: '问题与风险' },
...await getIssues(team, week)
]
// 使用并发控制
await createBlocksOptimized(page.id, blocks)
}
案例2:数据库同步
场景:
- 将数据库记录同步到Notion
- 每次同步100-500条记录
- 需要定期执行
问题:
- 大量API调用
- 耗时过长
- 可能超时失败
解决方案:
async function syncDatabaseToNotion(records) {
const batchSize = 50
const batches = chunk(records, batchSize)
for (const batch of batches) {
await Promise.all(
batch.map(record => syncRecord(record))
)
await sleep(1000) // 批次间延迟
}
}
案例3:内容迁移
场景:
- 从其他平台迁移内容到Notion
- 包含大量格式化内容
- 需要保持结构完整
问题:
- 格式转换复杂
- 大量block创建
- 迁移时间长
解决方案:
async function migrateContent(source, targetPageId) {
const content = await parseSource(source)
const blocks = convertToNotionBlocks(content)
// 分批创建
const batchSize = 30
for (let i = 0; i < blocks.length; i += batchSize) {
const batch = blocks.slice(i, i + batchSize)
await createBlocksOptimized(targetPageId, batch)
console.log(`已迁移 ${Math.min(i + batchSize, blocks.length)}/${blocks.length} 个block`)
}
}
最佳实践总结
1. 性能优化策略
关键点:
- 使用并发控制(p-limit)
- 实现重试机制
- 监控性能指标
- 分批处理大数据
2. 错误处理策略
关键点:
- 捕获所有错误类型
- 实现指数退避
- 记录错误日志
- 提供失败通知
3. 用户体验优化
关键点:
- 提供进度反馈
- 支持取消操作
- 保存中间状态
- 支持断点续传
4. 代码组织建议
目录结构:
/notion-integration
/src
/api
notion-client.js
rate-limiter.js
retry-handler.js
/utils
block-helpers.js
performance-monitor.js
/examples
weekly-report.js
database-sync.js
content-migration.js
/tests
api.test.js
performance.test.js
你的Notion API集成遇到过批量操作的限制吗? 欢迎在评论区分享你的经历和解决方案。
讨论 (0)
请先登录后参与讨论
还没有评论,成为第一个吐槽的人?