LOADING
980 字
5 分钟
Twikoo评论系统
2026-08-14
2026-08-18
实践
Serverless
帖前引言

本博客接入Twikoo评论系统部署

一、背景与结论

  • 本博客是一个 Astro 项目,本身已内置两个评论系统的前端组件:Twikoo 和 Waline(位于 src/components/comment/
  • 服务托管在 Cloudflare Workers
  • 结论:选用 Twikoo。 它是专为 Serverless 设计的评论系统,后端可以原生跑在 Cloudflare Workers 上(D1 存数据 + R2 存图片),冷启动 < 0.5s

二、为什么选 Twikoo 而不是 Waline

对比项TwikooWaline
后端架构Serverless 函数,可跑在 Cloudflare WorkersNode.js / Express 服务端
Cloudflare Workers 支持✅ 官方文档列出的部署方式之一❌ 官方明确表态不支持(架构与 Workers 不兼容)
数据存储D1(SQLite)LeanCloud
部署难度低(wrangler 一条命令)需 Vercel / Netlify / Docker
自带管理后台

Waline 若要上 Workers,只能靠社区重写项目(如 Waline_On_Worker),非官方、无保障,故放弃


三、部署 Twikoo 后端到 Cloudflare Workers

选用项目bluerosion/twikoo-cloudflare(Workers + D1 + R2)

部署步骤

Terminal window
# 1. 拉取项目并安装依赖
git clone https://github.com/bluerosion/twikoo-cloudflare.git ~/git/twikoo-cloudflare
cd ~/git/twikoo-cloudflare && npm install
# 2. 精简依赖(Workers 免费版有 1MiB 包大小限制,清掉不兼容的包)
echo "" > node_modules/jsdom/lib/api.js
echo "" > node_modules/tencentcloud-sdk-nodejs/tencentcloud/index.js
echo "" > node_modules/nodemailer/lib/nodemailer.js
# 3. 登录 Cloudflare
npx wrangler login
# 4. 创建 D1 数据库,把输出的 database_name / database_id 填入 wrangler.toml
npx wrangler d1 create twikoo
# 5. 初始化数据表结构
npx wrangler d1 execute twikoo --remote --file=./schema.sql
# 6. 创建 R2 存储桶(评论图片上传用)
npx wrangler r2 bucket create twikoo
# 然后把 R2 域名填入 wrangler.toml 的 R2_PUBLIC_URL
# 7. 部署
npx wrangler deploy --minify

部署成功验证

浏览器访问 Worker 地址,应返回:

{"code":100,"message":"Twikoo 云函数运行正常","version":"1.6.40"}

这个地址(含 https:// 前缀)就是前端要填的 envId


四、踩坑记录

坑 1:R2 未开通 —— [code: 10042]

报错现象

✘ [ERROR] A request to the Cloudflare API (/accounts/.../r2/buckets) failed.
Please enable R2 through the Cloudflare Dashboard. [code: 10042]

原因:Cloudflare 账号还没有激活 R2 服务,只是安装了 wrangler,API 调用被拒绝。

解决

  1. 登录 dash.cloudflare.com
  2. 进入账号级(Account),左侧导航点 R2 Object Storage
  3. 走激活流程(一般要求添加付款方式,免费额度内不扣费,免费档含 10GB 存储)
  4. 激活后重跑:npx wrangler r2 bucket create twikoo

备选方案:不想绑付款方式的话,改用 whq12520/twikoo-cf-workers(D1 + KV,无需 R2)。


坑 2:D1 绑定名错误 —— Cannot read properties of undefined (reading 'prepare')

报错现象

{"code":1000,"message":"Cannot read properties of undefined (reading 'prepare')"}

访问 Worker 地址时返回这个 JSON。

原因:把 wrangler.toml 里的 D1 binding"DB" 改成了 "twikoo",而代码里读取的是 env.DBsrc/index.js:352setDb(env.DB))。绑定名对不上 → env.DBundefined → 一执行 DB.prepare(...) 就抛 reading 'prepare'

解决:把 wrangler.tomlbinding 改回 DB,然后重新部署

Terminal window
npx wrangler deploy --minify

如果重新部署后报 no such table: comment,说明 schema.sql 还没执行:

Terminal window
npx wrangler d1 execute twikoo --remote --file=./schema.sql

关键认知(避免再踩)bindingdatabase_namedatabase_id 是三个不同的东西:

字段含义本项目的值
binding代码里读的变量名,必须叫 DB,不能改DB
database_name数据库展示名twikoo
database_id实际指向哪个 D1 库(部署时生成的 UUID)

五、博客前端集成

修改博客项目的 twilight.config.yaml后重新构建并部署 Astro 站点:

Terminal window
pnpm build

六、注意事项与扩展

  1. 路径斜杠:Twikoo Workers 版不会自动归一化 /post//post。项目前端已做去尾斜杠处理(twikoo.astrogetCurrentPath()),已规避。
  2. 前端版本:本地前端是 1.6.9,后端是 1.6.x,一般兼容;若接口异常可考虑把本地 twikoo.all.min.js 更新到与后端接近的版本。
  3. 同域优化:建议把 Worker 通过 Cloudflare 路由挂到站点同域名下(如 yourdomain.com/twikoo/*),省掉跨域预检,降低配额消耗。
  4. 邮件通知:因 nodemailer 与 Workers 不兼容,走 SendGrid / MailChannels 的 HTTPS API(SendGrid 免费档每天 100 封)。
  5. 已知限制(该 CF 部署项目):process.env 不可用、腾讯云无法集成、IP 归属地仅英文、分页一次返回当前页全部评论、反垃圾仅支持 Cloudflare Turnstile。

Twikoo评论系统
/projects/website/twikoo-comment/
作者
J.
发布于
2026-08-14
许可协议
CC BY-NC-SA 4.0
更新于 2026-08-18

部分信息可能已经过时

Profile Image of the Author
J.
我是Jiy,热爱生活的学生一只~
公告
欢迎来到我的博客!
目录
目录