Appearance
NotionComments 使用一个 Notion 数据库保存评论,适合不想额外部署 Twikoo、Waline 等评论后端的站点。
这不是 Notion 页面右上角的官方评论区,而是通过 Notion API 写入你自己的评论数据库。访客只需要填写邮箱和评论内容,不需要登录 Notion。
如果你需要后台审核、邮件通知、垃圾评论过滤、社交登录或头像系统,Twikoo、Waline、Artalk 仍然更合适。
部署限制:NotionComments 依赖本站的 /api/notion-comments 服务端接口,只支持 Vercel、Netlify、Zeabur、VPS、Node.js 服务等动态部署。使用 yarn export 生成纯静态站点时,没有服务端 API,不能使用这个插件。
/api/notion-comments
yarn export
NotionComments 采用“方案 A”:用一个独立的 Notion 数据库保存公开站点评论。
这样做不是因为 Notion 没有原生评论功能,而是因为公开博客的评论和 Notion 工作区内部协作评论不是同一个场景。独立数据库更可控,也更适合给匿名访客或普通读者使用。
因此当前推荐方案是独立评论数据库。它牺牲了一点“原生感”,换来更清晰的权限边界、更稳定的公开访客体验和更强的可控性。
Notion API 支持读取和创建页面评论,但它更适合工作区内部协作,不完全适合公开网站评论区:
如果你的站点是内部知识库,读者都在同一个 Notion 工作区里,原生评论会更自然;如果你的站点面向公开访客,独立评论数据库更稳妥。
Pending
Approved
推荐直接复制这个评论数据库模板: Notion 评论数据库模板。
打开模板后,点击右上角的 Duplicate / 复制,把它复制到你自己的 Notion 工作区。复制完成后,你就不需要再手动创建下面这些字段,只需要继续完成 Integration 授权和环境变量配置。
Duplicate
复制
如果你想自己从零创建数据库,字段名称必须和下表完全一致:
PostId
ParentId
Content
IpAddress
Author
Level
增强字段建议一起添加,复制模板的用户通常已经包含这些字段:
Nickname
EmailHash
Status
Spam
CreatedAt
UserAgent
基础字段必须存在;增强字段是可选的。旧数据库不添加增强字段也能继续提交评论,只是不会启用昵称保存、审核状态和额外排查信息。
建议把这个数据库放在站点数据库之外,方便单独管理评论。
Integration 可以理解成“给 NotionNext 使用的机器人账号”。NotionNext 不能直接用你的 Notion 登录态访问数据库,必须通过这个 Integration Token 才能读写评论数据库。
提醒:Integration 不只是评论插件会用到的配置。它是把网站上的用户交互安全写回 Notion 数据的关键能力。评论、表单、反馈、订单、会员资料、用户权限等功能,未来都可以沿着这条链路扩展。先把评论跑通,相当于给站点打通了“用户行为 -> Notion 数据库”的第一条通道。
New integration
新建集成
Notion_Comment
在 integration 管理页的 配置 页面,找到 功能 区域。
配置
功能
内容功能建议这样勾选:
读取内容
插入内容
更新内容
评论功能不要勾选:
读取评论
插入评论
这里使用的是独立 Notion 评论数据库,不是 Notion 页面右上角的原生评论功能,所以不需要给 integration 开启评论功能权限。权限越少越安全。
在同一个 配置 页面找到 集成令牌 或 访问令牌。
集成令牌
访问令牌
secret_
NOTION_TOKEN
注意:
blog.config.js
NEXT_PUBLIC_NOTION_TOKEN
只有创建 integration 还不够,还必须把评论数据库共享给它。否则接口会报没有权限。
推荐做法:
...
Connections
连接
如果你在 integration 管理页的 内容访问权限 页面操作,也可以点击 编辑权限,搜索评论数据库所在页面或数据库,然后添加访问权限。建议只授权评论数据库,不要把整个工作区都授权给这个 integration。
内容访问权限
编辑权限
配置完成后,应该满足:
NOTION_COMMENT_DATABASE_ID
如果评论提交失败,最常见原因就是只创建了 integration,但忘记把评论数据库共享给它。
在 Vercel、Netlify、Zeabur、服务器 .env 等部署环境中添加:
.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
NEXT_PUBLIC_
NOTION_COMMENT_REQUIRE_APPROVAL
true
NOTION_COMMENT_RATE_LIMIT
修改环境变量后需要重新部署。
打开评论数据库页面,浏览器地址通常类似:
https://www.notion.so/workspace/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx?v=yyyy
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 这段 32 位 ID 就是数据库 ID。复制时可以保留或去掉中间的短横线,Notion API 都能识别。
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Notion
评论按文章的 Notion 页面 ID 写入 PostId,所以文章改 slug 不会丢失评论关联。
评论提交后,会同时出现在文章评论区和你的 Notion 评论数据库中:
NotionNext 支持同时开启多个评论插件。开启 NotionComments 后,如果你同时配置了 Twikoo、Giscus、Waline 等插件,评论区会用 Tab 切换展示。
如果只想显示 NotionComments,请移除其他评论插件的环境变量。
NotionNext 仍然沿用通用规则:在文章数据库中添加 comment 属性,值设置为 Hide,该文章就不会显示评论区。
comment
Hide
NotionComments 需要 /api/notion-comments 服务端接口来读取和写入 Notion 数据库。纯静态导出模式没有服务端 API,无法使用这个插件。
也就是说,以下部署方式支持:
yarn start
以下方式不支持:
如果你必须使用静态导出,请选择 Giscus、Utterances、Cusdis 等不依赖本站 API 的方案。
检查:
检查 PostId 是否等于当前文章页面 ID。手动改数据库内容时,不要修改 PostId、ParentId 和 Level。
直接在 Notion 评论数据库中删除对应记录即可。删除父评论后,它下面的回复会作为独立评论显示,建议同时清理子回复。
参考实现:goldeye0351/notioncomments。
NotionComments
NotionComments 使用一个 Notion 数据库保存评论,适合不想额外部署 Twikoo、Waline 等评论后端的站点。
这不是 Notion 页面右上角的官方评论区,而是通过 Notion API 写入你自己的评论数据库。访客只需要填写邮箱和评论内容,不需要登录 Notion。
适合谁使用
如果你需要后台审核、邮件通知、垃圾评论过滤、社交登录或头像系统,Twikoo、Waline、Artalk 仍然更合适。
为什么选择独立评论数据库
NotionComments 采用“方案 A”:用一个独立的 Notion 数据库保存公开站点评论。
这样做不是因为 Notion 没有原生评论功能,而是因为公开博客的评论和 Notion 工作区内部协作评论不是同一个场景。独立数据库更可控,也更适合给匿名访客或普通读者使用。
因此当前推荐方案是独立评论数据库。它牺牲了一点“原生感”,换来更清晰的权限边界、更稳定的公开访客体验和更强的可控性。
为什么暂不使用 Notion 原生评论
Notion API 支持读取和创建页面评论,但它更适合工作区内部协作,不完全适合公开网站评论区:
如果你的站点是内部知识库,读者都在同一个 Notion 工作区里,原生评论会更自然;如果你的站点面向公开访客,独立评论数据库更稳妥。
功能
Pending改成Approved后再展示。准备 Notion 评论数据库
推荐直接复制这个评论数据库模板: Notion 评论数据库模板。
打开模板后,点击右上角的
Duplicate/复制,把它复制到你自己的 Notion 工作区。复制完成后,你就不需要再手动创建下面这些字段,只需要继续完成 Integration 授权和环境变量配置。如果你想自己从零创建数据库,字段名称必须和下表完全一致:
PostIdParentIdContentIpAddressAuthorLevel增强字段建议一起添加,复制模板的用户通常已经包含这些字段:
NicknameEmailHashStatusApproved、Pending、SpamCreatedAtUserAgent基础字段必须存在;增强字段是可选的。旧数据库不添加增强字段也能继续提交评论,只是不会启用昵称保存、审核状态和额外排查信息。
建议把这个数据库放在站点数据库之外,方便单独管理评论。
创建 Notion Integration
Integration 可以理解成“给 NotionNext 使用的机器人账号”。NotionNext 不能直接用你的 Notion 登录态访问数据库,必须通过这个 Integration Token 才能读写评论数据库。
1. 新建连接
New integration或新建集成。Notion_Comment,方便以后识别。2. 配置功能权限
在 integration 管理页的
配置页面,找到功能区域。内容功能建议这样勾选:
读取内容:用于读取评论数据库中的评论。插入内容:用于把新评论写入评论数据库。更新内容可选:当前基础评论功能不依赖它;如果以后要在站点侧编辑评论、标记审核状态,再开启它。评论功能不要勾选:
读取评论。插入评论。这里使用的是独立 Notion 评论数据库,不是 Notion 页面右上角的原生评论功能,所以不需要给 integration 开启评论功能权限。权限越少越安全。
3. 复制访问令牌
在同一个
配置页面找到集成令牌或访问令牌。secret_开头。NOTION_TOKEN。注意:
blog.config.js。NEXT_PUBLIC_NOTION_TOKEN这种前端可见变量名。4. 授权访问评论数据库
只有创建 integration 还不够,还必须把评论数据库共享给它。否则接口会报没有权限。
推荐做法:
...。Connections或连接。Notion_Comment。如果你在 integration 管理页的
内容访问权限页面操作,也可以点击编辑权限,搜索评论数据库所在页面或数据库,然后添加访问权限。建议只授权评论数据库,不要把整个工作区都授权给这个 integration。5. 检查是否配置成功
配置完成后,应该满足:
读取内容和插入内容已开启。NOTION_TOKEN和NOTION_COMMENT_DATABASE_ID。如果评论提交失败,最常见原因就是只创建了 integration,但忘记把评论数据库共享给它。
配置环境变量
在 Vercel、Netlify、Zeabur、服务器
.env等部署环境中添加:说明:
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
打开评论数据库页面,浏览器地址通常类似:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx这段 32 位 ID 就是数据库 ID。复制时可以保留或去掉中间的短横线,Notion API 都能识别。启用和验证
Notion评论 Tab 或评论表单。Status从Pending改为Approved,刷新文章页后再确认显示。评论按文章的 Notion 页面 ID 写入
PostId,所以文章改 slug 不会丢失评论关联。使用效果
评论提交后,会同时出现在文章评论区和你的 Notion 评论数据库中:
和其他评论插件一起使用
NotionNext 支持同时开启多个评论插件。开启 NotionComments 后,如果你同时配置了 Twikoo、Giscus、Waline 等插件,评论区会用 Tab 切换展示。
如果只想显示 NotionComments,请移除其他评论插件的环境变量。
关闭某篇文章评论
NotionNext 仍然沿用通用规则:在文章数据库中添加
comment属性,值设置为Hide,该文章就不会显示评论区。静态导出限制
NotionComments 需要
/api/notion-comments服务端接口来读取和写入 Notion 数据库。纯静态导出模式没有服务端 API,无法使用这个插件。也就是说,以下部署方式支持:
yarn start/ Node.js 运行 NotionNext。以下方式不支持:
yarn export生成的纯静态站点。如果你必须使用静态导出,请选择 Giscus、Utterances、Cusdis 等不依赖本站 API 的方案。
常见问题
页面没有显示评论区
检查:
NEXT_PUBLIC_COMMENT_NOTION_ENABLE是否为true。comment设置成了Hide。提交评论失败
检查:
NOTION_TOKEN是否正确,且没有误写成NEXT_PUBLIC_NOTION_TOKEN。NOTION_COMMENT_DATABASE_ID是否是评论数据库 ID。Status是否已经改成Approved。评论能写入,但页面不显示
检查
PostId是否等于当前文章页面 ID。手动改数据库内容时,不要修改PostId、ParentId和Level。如何删除垃圾评论
直接在 Notion 评论数据库中删除对应记录即可。删除父评论后,它下面的回复会作为独立评论显示,建议同时清理子回复。
安全建议
NOTION_TOKEN写进blog.config.js或任何前端可见配置。NOTION_COMMENT_REQUIRE_APPROVAL,在 Notion 数据库里手动审核。参考实现:goldeye0351/notioncomments。