NotionComments
July 28, 2026 · View on GitHub
NotionComments 使用一个 Notion 数据库保存评论,适合不想额外部署 Twikoo、Waline 等评论后端的站点。
这不是 Notion 页面右上角的官方评论区,而是通过 Notion API 写入你自己的评论数据库。访客只需要填写邮箱和评论内容,不需要登录 Notion。
适合谁使用
- 你已经在用 NotionNext,希望评论数据也保存在 Notion。
- 你不想维护 MongoDB、LeanCloud、独立评论服务或额外二级域名。
- 你能接受在 Notion 数据库中手动查看、删除或整理评论。
如果你需要后台审核、邮件通知、垃圾评论过滤、社交登录或头像系统,Twikoo、Waline、Artalk 仍然更合适。
部署限制:NotionComments 依赖本站的
/api/notion-comments服务端接口,只支持 Vercel、Netlify、Zeabur、VPS、Node.js 服务等动态部署。使用yarn export生成纯静态站点时,没有服务端 API,不能使用这个插件。
为什么选择独立评论数据库
NotionComments 采用“方案 A”:用一个独立的 Notion 数据库保存公开站点评论。
这样做不是因为 Notion 没有原生评论功能,而是因为公开博客的评论和 Notion 工作区内部协作评论不是同一个场景。独立数据库更可控,也更适合给匿名访客或普通读者使用。
| 方案 | 优点 | 限制 |
|---|---|---|
| 独立 Notion 评论数据库 | 访客不需要登录 Notion;字段可扩展;方便做审核、过滤、统计、迁移;也能复用到其他网站 | 不是 Notion 页面右上角的原生评论区,需要单独维护一个评论数据库 |
| Notion 原生页面评论 | 评论直接出现在文章对应的 Notion 页面中,站长可以在 Notion 内查看和回复 | API 能力受 Notion 限制;访客身份通常会变成 integration 身份;公开站点上的昵称、邮箱、审核、反垃圾仍要额外设计 |
因此当前推荐方案是独立评论数据库。它牺牲了一点“原生感”,换来更清晰的权限边界、更稳定的公开访客体验和更强的可控性。
为什么暂不使用 Notion 原生评论
Notion API 支持读取和创建页面评论,但它更适合工作区内部协作,不完全适合公开网站评论区:
- 访客不一定有 Notion 账号,也不应该为了评论被要求登录 Notion。
- 通过 API 写入时,评论通常代表 integration,而不是访客自己的 Notion 身份。
- 原生评论的部分能力受 API 限制,例如 resolved comments、选中文本范围讨论等能力不适合完整复刻成公开评论区。
- 公开网站常见的审核、垃圾评论处理、用户昵称、邮箱、统计、迁移,都更适合放在独立评论数据库中控制。
如果你的站点是内部知识库,读者都在同一个 Notion 工作区里,原生评论会更自然;如果你的站点面向公开访客,独立评论数据库更稳妥。
功能
- 文章评论和嵌套回复。
- 回复展开/收起。
- 评论列表加载更多。
- 昵称、邮箱识别和首字母头像。
- 可选审核状态:站长在 Notion 数据库里把
Pending改成Approved后再展示。 - 基础反垃圾:长度限制、蜜罐字段、同一 IP 简单频率限制。
- 提交中、加载中、加载失败重试等基础交互。
- 多评论插件并存时,作为一个评论 Tab 显示。
准备 Notion 评论数据库
推荐直接复制这个评论数据库模板: Notion 评论数据库模板。
打开模板后,点击右上角的 Duplicate / 复制,把它复制到你自己的 Notion 工作区。复制完成后,你就不需要再手动创建下面这些字段,只需要继续完成 Integration 授权和环境变量配置。
如果你想自己从零创建数据库,字段名称必须和下表完全一致:
| 字段 | 类型 | 说明 |
|---|---|---|
PostId | Title | 文章的 Notion 页面 ID,用来关联评论和文章 |
ParentId | Text | 父评论 ID,一级评论留空 |
Content | Text | 评论正文 |
IpAddress | Text | 访客 IP,用于排查滥用 |
Author | 访客邮箱,前缀会作为昵称显示 | |
Level | Number | 回复层级 |
增强字段建议一起添加,复制模板的用户通常已经包含这些字段:
| 字段 | 类型 | 说明 |
|---|---|---|
Nickname | Text | 访客填写的昵称,优先用于前台展示 |
EmailHash | Text | 邮箱哈希,用于未来头像、会员识别或去重 |
Status | Select | 审核状态,建议选项为 Approved、Pending、Spam |
CreatedAt | Date | 评论提交时间 |
UserAgent | Text | 浏览器 User-Agent,用于排查垃圾评论 |
基础字段必须存在;增强字段是可选的。旧数据库不添加增强字段也能继续提交评论,只是不会启用昵称保存、审核状态和额外排查信息。
建议把这个数据库放在站点数据库之外,方便单独管理评论。
创建 Notion Integration
Integration 可以理解成“给 NotionNext 使用的机器人账号”。NotionNext 不能直接用你的 Notion 登录态访问数据库,必须通过这个 Integration Token 才能读写评论数据库。
提醒:Integration 不只是评论插件会用到的配置。它是把网站上的用户交互安全写回 Notion 数据的关键能力。评论、表单、反馈、订单、会员资料、用户权限等功能,未来都可以沿着这条链路扩展。先把评论跑通,相当于给站点打通了“用户行为 -> Notion 数据库”的第一条通道。
1. 新建连接
- 打开 Notion integrations。
- 点击
New integration或新建集成。 - 名称可以填写
Notion_Comment,方便以后识别。 - 选择你的 Notion 工作区。
- 类型选择内部集成或 Internal integration。
- 保存后进入这个 integration 的管理页面。
2. 配置功能权限
在 integration 管理页的 配置 页面,找到 功能 区域。
内容功能建议这样勾选:
- 勾选
读取内容:用于读取评论数据库中的评论。 - 勾选
插入内容:用于把新评论写入评论数据库。 更新内容可选:当前基础评论功能不依赖它;如果以后要在站点侧编辑评论、标记审核状态,再开启它。
评论功能不要勾选:
- 不需要
读取评论。 - 不需要
插入评论。
这里使用的是独立 Notion 评论数据库,不是 Notion 页面右上角的原生评论功能,所以不需要给 integration 开启评论功能权限。权限越少越安全。
3. 复制访问令牌
在同一个 配置 页面找到 集成令牌 或 访问令牌。
- 点击令牌输入框右侧的复制按钮。
- 复制出来的值一般以
secret_开头。 - 把这个值保存为部署环境变量
NOTION_TOKEN。
注意:
- 不要把这个令牌发给别人。
- 不要写进
blog.config.js。 - 不要使用
NEXT_PUBLIC_NOTION_TOKEN这种前端可见变量名。
4. 授权访问评论数据库
只有创建 integration 还不够,还必须把评论数据库共享给它。否则接口会报没有权限。
推荐做法:
- 打开你前面创建的评论数据库页面。
- 点击页面右上角
...。 - 找到
Connections或连接。 - 搜索并选择刚创建的
Notion_Comment。 - 确认添加。
如果你在 integration 管理页的 内容访问权限 页面操作,也可以点击 编辑权限,搜索评论数据库所在页面或数据库,然后添加访问权限。建议只授权评论数据库,不要把整个工作区都授权给这个 integration。
5. 检查是否配置成功
配置完成后,应该满足:
- Integration 页面能看到访问令牌。
读取内容和插入内容已开启。- 评论数据库已连接到这个 integration。
- 部署环境变量里已经配置
NOTION_TOKEN和NOTION_COMMENT_DATABASE_ID。
如果评论提交失败,最常见原因就是只创建了 integration,但忘记把评论数据库共享给它。
配置环境变量
在 Vercel、Netlify、Zeabur、服务器 .env 等部署环境中添加:
NEXT_PUBLIC_COMMENT_NOTION_ENABLE=true
NOTION_COMMENT_DATABASE_ID=your_comment_database_id
NOTION_TOKEN=secret_xxx
# 可选:开启后新评论写入 Pending,前台只显示 Approved
NOTION_COMMENT_REQUIRE_APPROVAL=false
# 可选:同一 IP 每分钟最多提交次数,默认 5
NOTION_COMMENT_RATE_LIMIT=5
说明:
NEXT_PUBLIC_COMMENT_NOTION_ENABLE:开启 NotionComments。NOTION_COMMENT_DATABASE_ID:评论数据库 ID。NOTION_TOKEN:Notion integration token,是服务端密钥,不要加NEXT_PUBLIC_前缀。NOTION_COMMENT_REQUIRE_APPROVAL:是否开启审核。设置为true后,新评论会写入Pending,需要站长在 Notion 数据库中改成Approved才会显示。NOTION_COMMENT_RATE_LIMIT:基础频率限制,默认同一 IP 每分钟 5 条。
修改环境变量后需要重新部署。
获取数据库 ID
打开评论数据库页面,浏览器地址通常类似:
https://www.notion.so/workspace/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx?v=yyyy
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 这段 32 位 ID 就是数据库 ID。复制时可以保留或去掉中间的短横线,Notion API 都能识别。
启用和验证
- 部署后打开任意文章页。
- 滚动到评论区,应该能看到
Notion评论 Tab 或评论表单。 - 输入邮箱和评论内容并提交。
- 回到 Notion 评论数据库,确认新增了一条记录。
- 如果开启了审核,把这条记录的
Status从Pending改为Approved,刷新文章页后再确认显示。
评论按文章的 Notion 页面 ID 写入 PostId,所以文章改 slug 不会丢失评论关联。
使用效果
评论提交后,会同时出现在文章评论区和你的 Notion 评论数据库中:

和其他评论插件一起使用
NotionNext 支持同时开启多个评论插件。开启 NotionComments 后,如果你同时配置了 Twikoo、Giscus、Waline 等插件,评论区会用 Tab 切换展示。
如果只想显示 NotionComments,请移除其他评论插件的环境变量。
关闭某篇文章评论
NotionNext 仍然沿用通用规则:在文章数据库中添加 comment 属性,值设置为 Hide,该文章就不会显示评论区。
静态导出限制
NotionComments 需要 /api/notion-comments 服务端接口来读取和写入 Notion 数据库。纯静态导出模式没有服务端 API,无法使用这个插件。
也就是说,以下部署方式支持:
- Vercel / Netlify / Zeabur 等支持 Next.js API Routes 的平台。
- 自己的 VPS 或服务器上用
yarn start/ Node.js 运行 NotionNext。 - Docker、PM2、宝塔等本质上仍然运行 Node.js 服务的部署方式。
以下方式不支持:
yarn export生成的纯静态站点。- 只托管 HTML/CSS/JS 文件的静态空间。
- 没有 Node.js 服务端接口能力的对象存储、CDN 静态托管。
如果你必须使用静态导出,请选择 Giscus、Utterances、Cusdis 等不依赖本站 API 的方案。
常见问题
页面没有显示评论区
检查:
NEXT_PUBLIC_COMMENT_NOTION_ENABLE是否为true。- 修改环境变量后是否重新部署。
- 当前文章是否把
comment设置成了Hide。 - 是否启用了搜索引擎爬虫模式预览,爬虫不会加载评论组件。
提交评论失败
检查:
NOTION_TOKEN是否正确,且没有误写成NEXT_PUBLIC_NOTION_TOKEN。NOTION_COMMENT_DATABASE_ID是否是评论数据库 ID。- 评论数据库是否已共享给对应 integration。
- 数据库字段名称和类型是否与文档表格一致。
- 如果开启了审核,
Status是否已经改成Approved。
Netlify 部署后接口 404
先直接访问:
https://你的域名/api/notion-comments?postId=test
- 返回
[]或500:说明 API Route 已部署成功,再检查 Notion Token、数据库 ID、共享权限和字段。 - 返回
404:说明请求还没有进入 NotionComments 接口,优先检查 Netlify 是否启用了 Next.js API Routes,不要使用yarn export,也不要把发布目录设成out。
Netlify 项目应使用 Next.js 动态部署能力;构建日志里需要能看到 Next.js 插件和 Functions / API Routes 相关输出。
评论能写入,但页面不显示
检查 PostId 是否等于当前文章页面 ID。手动改数据库内容时,不要修改 PostId、ParentId 和 Level。
如何删除垃圾评论
直接在 Notion 评论数据库中删除对应记录即可。删除父评论后,它下面的回复会作为独立评论显示,建议同时清理子回复。
安全建议
- 不要把
NOTION_TOKEN写进blog.config.js或任何前端可见配置。 - 不要给 integration 授权整个工作区,只共享评论数据库即可。
- 如果站点评论量变大,建议开启
NOTION_COMMENT_REQUIRE_APPROVAL,在 Notion 数据库里手动审核。 - 评论内容会公开显示,不要让用户提交敏感信息。