freeCodeCamp 如何用 seed-daily-challenges 把每日编程挑战写入数据库?
【免费下载链接】freeCodeCampfreeCodeCamp.org's open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp
如果你需要给 freeCodeCamp 的数据库写入“每日编程挑战”数据,仓库提供了专用脚本 seed-daily-challenges.ts。它的任务很明确:从dev-playgroundsuperblock 中取出 JavaScript 和 Python 两套每日挑战,校验后合并成每天一条的文档,写入 MongoDB 中freecodecamp数据库的DailyCodingChallengescollection。本文按 README 给出的流程,说明如何完成这次写入并确认结果。
脚本的数据流
在动手之前先弄清脚本做了什么,后面看到日志输出时才好对照(依据 seed-daily-challenges.ts 和 helpers.ts):
- 通过主 client 的 GraphQL 接口
http://localhost:8000/___graphql分别拉取dev-playgroundsuperblock 下daily-coding-challenges-javascript和daily-coding-challenges-python两个 block 的挑战,按challengeOrder升序排列。 - 校验 JavaScript 与 Python 挑战数量一致,且都等于
EXPECTED_CHALLENGE_COUNT(当前为 365)。 - 按顺序把第 i 个 JS 挑战和第 i 个 Python 挑战合并为一个文档:
_id取 JS 挑战的 id(注释强调不能改,它会被写入用户的completedDailyCodingChallenges[]),日期为起始日START_DATE加 i 天,标题去掉Challenge N:前缀。合并时还会校验两端标题、描述、测试数量一致,不一致直接报错。 - 用
bulkWrite+replaceOne(upsert: true)按_id替换或新建文档,写完后再countDocuments核对总数。
挑战源文件位于 dev-playground.json、daily-coding-challenges-javascript.json 和 daily-coding-challenges-python.json。
准备条件
README 列出的前置步骤是:安装依赖、让主 client 以“显示 upcoming changes”的方式跑起来(脚本依赖它从 GraphQL 拿数据)、进入tools/daily-challenges目录。具体到配置:
1. MongoDB 连接串。在tools/daily-challenges/下把 sample.env 复制为.env:
cp sample.env .envsample.env中只有一行,指向本地 MongoDB 上的freecodecamp库:
MONGOHQ_URL=mongodb://127.0.0.1:27017/freecodecamp?directConnection=true脚本未设置MONGOHQ_URL时也会回退到同一个默认值,但按 README 的要求仍应先建.env。
2. 主 client 必须在运行且展示 upcoming changes。仓库根目录的 sample.env 中SHOW_UPCOMING_CHANGES默认是false,需要让主 client 以展示 upcoming changes 的方式启动(该变量设为true),否则 GraphQL 查询拿不到 dev-playground 中的挑战。脚本固定请求http://localhost:8000/___graphql,所以主 client 需要在本机 8000 端口提供服务。
3. 依赖已安装。package.json 中的seed-daily-challenges脚本实际执行tsx seed-daily-challenges.ts,运行时会用到dotenv、mongodb(6.21.0)、tsx等 devDependencies。
脚本头部注释还要求:seeding 之前先在dev-playgroundsuperblock 上跑一遍 curriculum 测试,确认测试通过。
执行 seeding
进入目录后运行 pnpm 脚本:
cd tools/daily-challenges pnpm seed-daily-challenges副作用说明:这条命令会向MONGOHQ_URL指向的 MongoDB 的DailyCodingChallengescollection 批量replaceOne(带upsert),即按_id覆盖或新增约 365 条文档。本地库可直接跑;脚本注释明确指出,生产环境 seeding 后不应再改动起始日期和 id,操作前请确认目标库。
验证写入结果
脚本自己会打印阶段日志,可以按顺序对照:
Successfully connected to mongo Fetching challenges... 365 challenges found for each language Creating new challenges... Finished creating new challenges Writing 365 challenges to database... Finished writing challenges to database第一步client.db('admin').command({ ping: 1 })成功才会打印Successfully connected to mongo,这是连接成功的信号。写入完成后脚本会执行countDocuments():如果库中总数不等于 365,会打印一段WARNING(Expected 365 challenges in the database, but found N documents),表示 collection 中还有预期之外的文档,需要自行检查。没有警告即说明总数与预期一致。
常见报错与限制
以下报错都在脚本中定义,遇到时按提示定位:
Failed to find any challenges with GraphQL query. The client needs to be running:GraphQL 查询没有返回任何挑战。通常是主 client 没启动、不在localhost:8000,或没有开启展示 upcoming changes,脚本拿不到 dev-playground 数据。Expected 365 challenges, but found N challenges:拉取到的挑战数与EXPECTED_CHALLENGE_COUNT不符;同文件还注明,如果 block 中挑战数量发生变化,需要同步更新这个常量。Number of challenges do not match: ... JavaScript vs Python challenges found:两套语言挑战数量不一致。- 标题/描述/测试数量不一致:合并阶段会对每一对挑战校验
titles do not match、descriptions do not match或do not have the same number of tests,说明 JS 与 Python 两侧的课程内容已不同步。 - 起始日期被改动:脚本内置了 sanity check,
START_DATE(2025-08-11T00:00:00.000Z)的 ISO 字符串若变化会直接抛出错误,并提示“如果是在 seeding production,发布之后不应再改起始日期”;本地开发则可以修改。 - 其他异常统一走
handleError:打印Oh noes!! Error seeding Daily Challenges.和错误详情,关闭 Mongo 连接后以退出码 1 结束进程。
完成以上流程后,DailyCodingChallengescollection 中就包含了带日期、编号、双语言测试与文件内容的每日挑战文档,可供 freeCodeCamp 站点的每日挑战功能读取。
【免费下载链接】freeCodeCampfreeCodeCamp.org's open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考