news 2026/9/10 15:06:33

freeCodeCamp 如何用 seed-daily-challenges 把每日编程挑战写入数据库?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
freeCodeCamp 如何用 seed-daily-challenges 把每日编程挑战写入数据库?

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):

  1. 通过主 client 的 GraphQL 接口http://localhost:8000/___graphql分别拉取dev-playgroundsuperblock 下daily-coding-challenges-javascriptdaily-coding-challenges-python两个 block 的挑战,按challengeOrder升序排列。
  2. 校验 JavaScript 与 Python 挑战数量一致,且都等于EXPECTED_CHALLENGE_COUNT(当前为 365)。
  3. 按顺序把第 i 个 JS 挑战和第 i 个 Python 挑战合并为一个文档:_id取 JS 挑战的 id(注释强调不能改,它会被写入用户的completedDailyCodingChallenges[]),日期为起始日START_DATE加 i 天,标题去掉Challenge N:前缀。合并时还会校验两端标题、描述、测试数量一致,不一致直接报错。
  4. bulkWrite+replaceOneupsert: 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 .env

sample.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,运行时会用到dotenvmongodb(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 matchdescriptions do not matchdo 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 15:06:16

CANN/GE:模型图总数查询API

aclmdlBundleGetQueryModelNum 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTor…

作者头像 李华
网站建设 2026/9/10 15:05:31

游戏运营AI自动化:提升数据处理与玩家行为分析效率

1. 项目概述:当游戏运营遇上AI自动化这个项目本质上是一套为游戏运营团队设计的智能分析系统,它解决了两个核心痛点:一是通过自动化工具替代人工整理日报周报的重复劳动,二是利用AI问答技术快速洞察玩家行为规律。我在某MMORPG项目…

作者头像 李华
网站建设 2026/9/10 15:01:17

CANN/ge图引擎SetCustomValue API

SetCustomValue 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow…

作者头像 李华