SpaceX-API 历史事件查询指南:使用 POST /v4/history/query 构建灵活的历史数据检索
后端API设计【免费下载链接】SpaceX-API:rocket: Open Source REST API for SpaceX launch, rocket, core, capsule, starlink, launchpad, and landing pad data.项目地址https://gitcode.com/gh_mirrors/spa/SpaceX-API点击查看免费下载本篇技术指南以 SpaceX-API 仓库中的docs/history/v4/query.md为核心系统讲解如何通过POST https://api.spacexdata.com/v4/history/query端点查询 SpaceX 历史事件数据。你将掌握该端点的请求格式、分页参数、全文检索与日期范围筛选等实战技巧并深入理解其背后的 Mongoose 数据模型与 Koa 路由实现从而能够在自己的应用中构建准确、高效的历史事件数据查询方案。一、端点概览/v4/history/query是 SpaceX-API v4 中历史事件History模块的查询入口与返回全部数据的GET /v4/history见 all.md和返回单条数据的GET /v4/history/:id见 one.md不同它通过POST请求体传入 MongoDB 查询条件与分页选项实现精确筛选、排序和分页读取。属性值MethodPOSTURLhttps://api.spacexdata.com/v4/history/queryAuth requiredFalseContent-Typeapplication/json请求体默认结构{ query: {}, options: {} }其中query接受任意合法的 MongoDBfind()查询语句用于条件过滤options接受 mongoose-paginate-v2 支持的分页与字段控制选项用于排序、分页、字段裁剪等。完整的分页与查询语法说明见仓库根目录的 queries.md 指南本节所有示例均遵循该指南约定。二、底层实现从路由到数据模型在深入请求参数之前先看该端点在仓库中的真实实现这有助于理解各个选项是如何生效的。路由定义位于 routes/history/v4/index.js核心代码为router.post(/query, cache(300), async (ctx) { const { query {}, options {} } ctx.request.body; try { const result await History.paginate(query, options); ctx.status 200; ctx.body result; } catch (error) { ctx.throw(400, error.message); } });从源码可以确认以下实现事实请求体被解构为query和options两个对象未提供时默认为空对象查询经由History.paginate(query, options)执行该方法来自 mongoose-paginate-v2 插件查询失败时抛出400 Bad Request响应体为 Mongoose 错误信息及修正建议与原文档中 Error Responses 一节描述一致该路由还挂载了cache(300)中间件即 300 秒 Redis 缓存详见 middleware/cache.js。数据模型位于 models/history.js其 Schema 定义了可查询的字段结构const historySchema new mongoose.Schema({ title: { type: String, default: null }, event_date_utc: { type: String, default: null }, event_date_unix: { type: Number, default: null }, details: { type: String, default: null }, links: { article: { type: String, default: null } }, }, { autoCreate: true }); const index { title: text, details: text, }; historySchema.index(index); historySchema.plugin(mongoosePaginate); historySchema.plugin(idPlugin); const History mongoose.model(History, historySchema);关键点title与details被声明为text 索引这正是$text全文检索能够工作的前提见下文示例模型通过mongoosePaginate插件获得paginate()能力通过idPlugin暴露id字段该模型经由 models/index.js 统一导出供路由层引用。三、成功响应结构当查询成功时接口返回200 OK响应体是标准的分页结构每页默认limit为 10{ docs: [ { title: SpaceX successfully launches humans to ISS, event_date_utc: 2020-05-30T19:22:00Z, event_date_unix: 1590866520, details: This mission was the first crewed flight to launch from the United States since the end of the Space Shuttle program in 2011. It carried NASA astronauts Doug Hurley and Bob Behnken to the ISS., links: { article: https://spaceflightnow.com/2020/05/30/nasa-astronauts-launch-from-us-soil-for-first-time-in-nine-years/ } } ... ], totalDocs: 7, offset: 0, limit: 10, totalPages: 1, page: 1, pagingCounter: 1, hasPrevPage: false, hasNextPage: false, prevPage: null, nextPage: null }各字段含义如下字段含义docs当前页命中的历史事件数组元素结构与 schema.md 中定义的一致totalDocs满足查询条件的文档总数offset当前页跳过的文档数limit每页返回的最大条数totalPages总页数page当前页码从 1 开始pagingCounter当前页第一条记录的全局序号hasPrevPage/hasNextPage是否存在上一页 / 下一页prevPage/nextPage上一页 / 下一页页码不存在时为null四、options 常用参数详解options支持 mongoose-paginate-v2 的全部选项原文档 queries.md 中归纳了最常用的几个select{ Object | String }—— 指定要返回的字段默认返回全部字段sort{ Object | String }—— 排序方式如{ event_date_unix: desc }offset{ Number }—— 跳过的文档数量与page二选一即可设定起始位置page{ Number }—— 页码limit{ Number }—— 每页条数pagination{ Boolean }—— 设为false时返回全部匹配文档而不施加limit默认truepopulate{ Array | Object | String }—— 需要填充为完整文档的关联路径。4.1 分页与排序按事件时间倒序取第二页每页 5 条{ query: {}, options: { page: 2, limit: 5, sort: { event_date_unix: desc } } }4.2 字段裁剪只返回标题与事件时间减少响应体积{ query: {}, options: { select: { title: 1, event_date_utc: 1 } } }4.3 关闭分页获取全量{ query: {}, options: { pagination: false } }五、query 过滤实战示例query接受任意合法的 MongoDB 查询语法。以下示例均针对 History 集合的字段设计可直接复制到请求体中验证。5.1 按时间范围筛选历史事件的event_date_utc为 ISO 8601 格式字符串配合$gte、$lte可实现区间筛选。日期需符合 ISO 8601 才能正确比较{ query: { event_date_utc: { $gte: 2017-06-22T00:00:00.000Z, $lte: 2017-06-25T00:00:00.000Z } } }也可以直接基于 Unix 时间戳字段event_date_unix进行数值区间查询同样使用$gte/$lte。5.2 全文检索对title和details做关键词搜索。由于这两个字段已建立 text 索引可直接使用$text{ query: { $text: { $search: ISS } } }说明$text会检索集合中的所有 text 索引字段。MongoDB 还支持$text的其他操作符如$language、$caseSensitive、$diacriticSensitive如需更多细节可查阅 MongoDB 官方$text参考文档。5.3 组合条件将范围筛选与精确匹配结合例如查询 2020 年之后、且标题包含 launch 的事件{ query: { event_date_unix: { $gte: 1577836800 }, $text: { $search: launch } }, options: { sort: { event_date_unix: asc }, limit: 20 } }六、错误响应当查询条件非法例如字段名拼写错误、操作符使用不当时接口返回Code:400 Bad RequestContent: Mongoose 错误信息其中包含修正查询的建议。这一行为与路由实现中ctx.throw(400, error.message)的处理逻辑一致Mongoose 在解析查询失败时会抛出带描述信息的异常异常信息会直接作为响应体返回便于开发者定位问题。七、与其他 History 端点的配合使用/v4/history/query并非孤立的端点它可与同模块的其他端点组合成完整的数据消费方案端点用途GET /v4/history获取全部历史事件无分页见 all.mdGET /v4/history/:id按 ID 获取单条历史事件见 one.mdPOST /v4/history/query按条件筛选 分页查询本文主题典型场景是先用 query 端点按关键词或时间范围筛选出符合条件的id列表再对关键事件调用单条端点获取完整详情或者直接利用select裁剪字段在一次请求中完成数据抽取。八、补充说明缓存行为query 端点带有 300 秒 TTL 的 Redis 缓存实现见 middleware/cache.js且仅在NODE_ENVproduction且 Redis 可用时生效可通过响应头spacex-api-cacheHIT/MISS和Cache-Control: max-age300判断缓存命中情况。无需鉴权该端点Auth required: False与创建POST /v4/history需要history:create权限、更新PATCH /v4/history/:id、删除DELETE /v4/history/:id等写操作不同查询数据是公开能力。版本兼容路由前缀为/(v4|latest)/history见 routes/history/v4/index.js即v4与latest指向同一套实现文档中的请求同样适用于latest版本。九、小结POST /v4/history/query是访问 SpaceX 历史事件数据的核心查询接口。通过组合 MongoDB 查询语法$text、$gte/$lte、$or等与 mongoose-paginate-v2 分页选项sort、limit、page、select、pagination你可以精确检索特定时间段或主题的历史事件并灵活控制返回结构与数据量。结合 models/history.js 中的 text 索引与 routes/history/v4/index.js 的实现细节即可完整理解并可靠使用该端点。赞分享后端API设计【免费下载链接】SpaceX-API:rocket: Open Source REST API for SpaceX launch, rocket, core, capsule, starlink, launchpad, and landing pad data.项目地址https://gitcode.com/gh_mirrors/spa/SpaceX-API点击查看免费下载相关推荐如何把 Qwen Code 打成白标桌面版Tauri 品牌化构建实战指南如何把 Qwen Code 打成白标桌面版Tauri 品牌化构建实战指南 需求摆在台面上给 Qwen Code 做一个 Acme AI 的白标whit人工智能AI Agent代码智能体工具调用交互助手CLIQwenSpaceX-API Launchpad 查询接口实战指南基于 POST /v4/launchpads/query 构建灵活查询与分页SpaceX API Launchpad 查询接口实战指南基于 POST /v4/launchpads/query 构建灵活查询与分页 本指南围绕 Space后端API设计SpaceX-API 历史事件接口全解析从 GET /v4/history 到查询、分页与源码实现SpaceX API 历史事件接口全解析从 GET /v4/history 到查询、分页与源码实现 本文以 docs/history/v4/all.md 定义后端API设计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

图书馆座位预约管理系统:从抢座乱象到扫码落座的完整落地路径

图书馆座位预约管理系统:从抢座乱象到扫码落座的完整落地路径

简介:这份资源是《图书馆座位预约管理系统》的完整Java项目源码包,面向学习Java Web开发的学生与初级开发者,用于掌握从需求分析到系统落地的全过程。系统围绕座位状态查看、预约、取消及超时自动释放等核心功能展开,采用表现层、…

2026/9/25 1:09:57 阅读更多 →
PostGraphile 枚举(Enum)完整指南:PostgreSQL 枚举、Enum 表与 extendSchema 的三种实践方案

PostGraphile 枚举(Enum)完整指南:PostgreSQL 枚举、Enum 表与 extendSchema 的三种实践方案

后端API网关 【免费下载链接】crystal 🔮 Graphiles Crystal Monorepo; home to Grafast, PostGraphile, pg-introspection, pg-sql2 and much more! 项目地址: https://gitcode.com/gh_mirrors/cry/crystal 点击查看 免费下载 导读 本指南聚焦 PostGr…

2026/9/25 5:43:38 阅读更多 →
极简命令行工具cua:用Shell脚本打造高效开发助手

极简命令行工具cua:用Shell脚本打造高效开发助手

1. 从一个代号说起:cua 到底是什么先交代背景。我第一次在内部工具仓库里看到cua这个命名时,第一反应是某个缩写。翻完文档才发现,它就是一次敲键盘时手指惯性打出来的三个字母,没有任何高深含义。后来用顺手了,反而觉…

2026/9/25 2:31:24 阅读更多 →

最新新闻

性能测试必知:Redis内存管理从底层开销到压测排障实战

性能测试必知:Redis内存管理从底层开销到压测排障实战

做过完整链路压测的人大概率都遇到过一种“玄学”:业务应用和数据库的指标看起来都正常,但压测一上并发,接口P99直接翘头。追到最后,问题总是指向一个常常被忽略的地方——Redis内存。Redis之所以能扛住高并发,靠的是把…

2026/9/26 7:55:04 阅读更多 →
Selenium自动化测试框架核心原理与工程实践:从WebDriver到Page Object

Selenium自动化测试框架核心原理与工程实践:从WebDriver到Page Object

1. 为什么我最终选择了Selenium作为自动化测试的起点做自动化测试这些年,身边总有人问我:市面上那么多工具,Cypress、Playwright、Appium,为什么你最终扎根在Selenium上?这个问题其实挺有意思的,我得从一次…

2026/9/26 7:55:04 阅读更多 →
白盒测试实战指南:从覆盖率指标到用例设计全解析

白盒测试实战指南:从覆盖率指标到用例设计全解析

做了几年测试之后,你会慢慢发现一个规律:很多听起来烂熟的名词,实际能讲透的人没几个。白盒测试就是其中之一。一说白盒测试,大多数人的第一反应是"看代码""写单测",然后就没有下文了。但你真的在…

2026/9/26 7:55:03 阅读更多 →
自动驾驶晶振选型进阶:从通用频偏考量到车规级严苛工况验证

自动驾驶晶振选型进阶:从通用频偏考量到车规级严苛工况验证

在车载硬件开发中,很多习惯了消费电子或通用工控选型的工程师容易陷入一个惯性误区:只要标称频率对得上、基础频偏落在10ppm到20ppm区间、封装尺寸合适且单价低,晶振就能直接上板。然而当这套逻辑被套用到自动驾驶域控制器(ADAS/A…

2026/9/26 7:55:03 阅读更多 →
Agent开发实战:为什么优化Harness比换模型更有效

Agent开发实战:为什么优化Harness比换模型更有效

1. 为什么“换一套 Harness”能顶两代模型 先把结论摆在前面:在 Agent 开发这条线上, Harness 的工程成熟度,往往比模型本身的代际提升更能决定最终效果 。我最近半年在几个 Agent 项目里反复验证过这件事——同一个模型,换一套…

2026/9/26 7:55:03 阅读更多 →
PowerShell指定目录启动的5种生产级方案

PowerShell指定目录启动的5种生产级方案

1. 项目概述:不是“怎么打开”,而是“如何精准控制PowerShell的启动上下文” “怎么打开指定目录下的PowerShell”——这句话看似简单,但背后藏着Windows命令行生态里一个被严重低估的核心痛点: 默认启动行为与实际工作场景的错配…

2026/9/26 7:54:03 阅读更多 →

日新闻

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、…

2026/9/26 0:00:25 阅读更多 →
学校官网模拟全流程实践:从页面布局到后端接口与部署

学校官网模拟全流程实践:从页面布局到后端接口与部署

如果你正在找一门 Web 大作业的题目,或者刚开始接触 Web 前端开发想做点能拿来展示的东西,“学校官网模拟”几乎是最稳的选择。题目看着简单,但要把导航、新闻列表、轮播 Banner、二级页面、后台数据都串起来,其实已经把前端布局、…

2026/9/26 0:00:25 阅读更多 →
超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

简介:这是一份面向游戏开发初学者与C进阶学习者的超级玛丽(超级马里奥)游戏源码,基于C面向对象编程实现,适合想通过经典项目理解游戏主循环、角色类设计、地图关卡加载与物理碰撞检测的读者参考。压缩包共49个文件&…

2026/9/26 0:00:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/25 19:27:14 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/25 20:29:09 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/25 20:29:43 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/25 19:27:26 阅读更多 →