Sails.js 的 `.fetch()` 查询方法:让 Waterline 回传增删改记录的完整指南

发布时间:2026/9/21 23:19:41

Sails.js 的 `.fetch()` 查询方法:让 Waterline 回传增删改记录的完整指南 Sails.js 的.fetch()查询方法让 Waterline 回传增删改记录的完整指南【免费下载链接】sailsRealtime MVC Framework for Node.js项目地址: https://gitcode.com/gh_mirrors/sa/sails.fetch()是 Sails.js 内置 ORMWaterline中一个短小但极为实用的查询实例query instance方法。执行.create()、.createEach()、.update()或.destroy()这类写操作时默认情况下数据库不会回传受影响的记录链式调用.fetch()即可让 Waterline 与底层数据库适配器把这些记录原样返回。读完本文你将掌握.fetch()的用法、返回类型差异、与.meta({fetch: true})的关系以及在大批量写操作下如何规避性能陷阱。为什么需要.fetch()写操作的默认沉默行为在 Sails 应用中查询实例query instance是模型方法返回的可链式延迟对象Deferred例如Zookeeper.find()返回的对象在await之前并不会真正执行详见 Queries 文档。对于读操作.find()等执行后自然能拿到记录但对于写操作情况不同执行.update()、.create()、.createEach()或.destroy()时默认不会返回任何数据如果使用回调风格.exec()则回调的第二个参数将是undefined。这一设计是为了性能写操作默认只关心是否成功数据库无需把受影响的记录序列化回传。当你确实需要拿到刚刚写入/更新/删除的那条些记录时才需要链式调用.fetch()显式要求 Waterline 和底层数据库适配器把结果送回来。这一默认行为在框架源码中也有直接印证。在 lib/hooks/blueprints/actions/create.js 中blueprint 的 create action 执行完Model.create(data).meta(queryOptions.meta).exec(...)后会检查// If we didnt fetch the new instance, just return OK. if (!newInstance) { return res.ok(); }也就是说未启用 fetch 时即便通过 REST 接口调用 blueprint create响应也只是状态 OK而不携带新记录数据。基本用法零参数一行链式调用.fetch().fetch()不接受任何参数。它必须链式接在写操作模型方法返回的查询实例之后并且需要在查询真正执行await、.exec()、.then()或.toPromise()之前调用。典型示例创建后立即取回新记录原文档给出的经典示例是在.create()之后链式调用.fetch()从而立刻拿到带主键id的新记录var newUser await User.create({ fullName: Alice McBailey }).fetch(); sails.log(Hi, ${newUser.fullName}! Your id is ${newUser.id}.);执行await后newUser即为数据库中实际写入的那条记录包含自动生成的主键、默认值、生命周期回调写入的字段等。没有.fetch()的话newUser将是undefined。各写操作方法的返回类型与差异.fetch()在不同写操作方法上的返回形态不同理解这一点可以避免解包时的低级错误模型方法默认返回链式.fetch()后的返回.create()无单个记录((dictionary))即新建的那条记录.createEach()无记录数组((array))包含所有新建记录.update()无记录数组((array))包含所有被更新的记录.destroy()无记录数组((array))包含所有被删除的记录以 .create() 文档 中的 Result 表格说明为例为了优化性能创建出的记录默认不作为结果返回只有链式调用.fetch()后新记录才会被回传——并且要注意在部分适配器中这需要额外执行一次数据库查询。.update()与.destroy()的文档也做了同样说明。批量更新后取回所有受影响记录var updatedUsers await User.update({name:Finn}) .set({ name:Jake }) .fetch(); sails.log(Updated all ${updatedUsers.length} user${updatedUsers.length1?:s} named Finn to have the name Jake. Here they are now:); sails.log(updatedUsers);注意.update()的返回始终是数组——即使只有一条记录被更新。同时需注意update查询不支持skip/limit分页与select投影。删除后取回被销毁的记录var burnedBooks await Book.destroy({ controversiality: { : 0.9 } }).fetch(); sails.log(Deleted books:, burnedBooks);同样.destroy()返回被删除记录的数组。另请留意 .destroy() 文档 中的安全提示如果 criteria 传入空字典{}将销毁表中所有记录。新记录的主键是.fetch()最常见的用途.create()后拿不到主键是新手最常见的困惑之一。由于主键通常由数据库自动生成自增 id 或 uuid没有.fetch()就无法在后续逻辑中引用新记录。这也是.fetch()在 Sails 应用中出现频率最高的场景。底层原理.fetch()就是.meta({fetch: true})的快捷方式原文档明确给出了关键结论.fetch()只是.meta({fetch: true})的语法糖shortcut。.meta() 文档 的 Supported options 表格完整列出了fetch这一 meta 键OptionTypeDefaultDetailsfetch((boolean))false在执行.update()、.create()、.createEach()或.destroy()查询时设为true可让数据库适配器回传所有被更新/删除的记录否则.exec()回调的第二个参数为undefined。警告对影响大量记录的 update/destroy 查询启用该键可能引发性能问题。因此下面两种写法完全等价var newUser await User.create({ name: alice }).fetch(); // 等价写法 var newUser2 await User.create({ name: alice }).meta({ fetch: true });meta 键还有第三种设置途径在显式回调之后传入字典例如User.create({ name: alice }, function(err, newUser){/* ... */}, { fetch: true });从框架源码看fetch键贯穿了整个 blueprint 层。例如 lib/hooks/blueprints/parse-blueprint-options.js 在为 create action 组装查询选项时直接设置了queryOptions.meta { fetch: true }同一文件 L344-L345 对 update action 也做了同样处理。这说明REST 蓝图接口默认就能回传新建/更新后的记录随后还会在 create.js 中通过findOne做一次 populate 再返回。.fetch()与生命周期回调lifecycle callbacks的联动fetch键不仅影响返回值还影响模型生命周期回调的执行。在 lib/hooks/blueprints/actions/destroy.js 的源码注释中明确写道...well also include the meta query options for the purpose of enabling theafterDestroylifecycle callback (which only runs if.meta({fetch: true})is included).也就是说blueprint destroy action 之所以在findOne与destroy上都透传queryOptions.meta正是为了让afterDestroy这类生命周期回调在fetch: true时得以触发。由此可以推断当你需要依赖写操作后的生命周期回调如afterCreate、afterUpdate、afterDestroy时带上.fetch()或meta: {fetch: true}是必要条件之一反之若确认不需要回传数据省略它还能顺带跳过这些回调的额外开销。性能警告大批量写操作慎用.fetch()原文档给出了一条明确的警告Warning: This is not recommended for update/destroy queries that affect large numbers of records.原因在于要求适配器收集并回传每一条受影响记录的完整数据会显著增加数据库与 Node.js 进程之间的数据传输量部分适配器还需要额外发起一次查询见 .create() 文档 中 requires an extra database query in some adapters 的说明。在批量任务例如定时清理、批量状态迁移中这可能会拖慢整次操作。实践建议只需确认是否成功省略.fetch()仅关注是否抛错需要主键或受影响记录使用.fetch()但尽量缩小 criteria 的影响范围大表全量更新/删除考虑分批处理如按id分段避免单次查询影响海量记录追求性能且数据库支持把级联删除等需求下推到物理层如 MySQL/PostgreSQL 的 CASCADE 约束而不是依赖 ORM 层逐条处理详见 .meta() 文档 中关于cascade键的说明。错误处理与执行方式.fetch()本身不引入新的错误类型它与普通查询一样错误取决于所执行的模型方法与底层适配器UsageError、AdapterError、Error等详见各模型方法文档中的 Errors 小节。查询既可以用await执行推荐代码更简洁、更安全也可以用.exec()回调或.then()/.catch()链式执行。需要提醒的是.exec()回调风格下.fetch()决定的就是回调第二参数是否为undefined。小结.fetch()是 Waterline 查询实例中用一行代码换回写操作结果的便捷方法适用对象.create()、.createEach()、.update()、.destroy()返回值单个记录或记录数组取决于模型方法本质.meta({fetch: true})的快捷方式默认fetch: false附加价值与afterCreate/afterUpdate/afterDestroy等生命周期回调联动blueprint destroy 源码中有明确印证主要风险影响大量记录的 update/destroy 查询会带来性能开销应谨慎使用。在 fetch.md 原文档 基础上建议进一步阅读 Queries 总览 理解查询实例的 Deferred 机制以及 .meta() 了解cascade、skipAllLifecycleCallbacks、decrypt等更多 meta 键的完整能力。【免费下载链接】sailsRealtime MVC Framework for Node.js项目地址: https://gitcode.com/gh_mirrors/sa/sails创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/21 23:19:41

金螳螂家装避坑指南:从入门到精通,搞定代码跑不通难题

金螳螂家装避坑指南:从入门到精通,搞定代码跑不通难题 复制来的代码跑不通不知道怎么调,这是很多刚接触工程数字化或想给金螳螂家装做内部效率工具的开发者最崩溃的时刻。你看着屏幕上的报错,心里只有一个念头:这代码到底哪里断了?从入门到精通的路上,…

2026/9/21 23:14:41

尤甚新手避坑:3个底层逻辑讲透项目搭建痛点

尤甚新手避坑:3个底层逻辑讲透项目搭建痛点 学会语法却不知怎么搭项目,这是无数开发者卡在入门到进阶的深坑里。尤甚作为近期技术圈热议的架构思维模型,常被误解为某种特定语言或框架,实则它是一种 以数据流向和状态管理为核心…

2026/9/21 23:14:41

3个高频坑让老东家性能优化面试稳过

3个高频坑让老东家性能优化面试稳过 官方文档里关于 老东家 的章节动辄几百页,翻半天还是记不住重点,尤其是 性能优化 相关的参数调优,更是让人头大。 别慌,咱们不背文档。 今天就把 老东家 在面试中最爱考的几个点,给你拆得明明白白。…

2026/9/22 0:34:56

关爱男性健康新手避坑:3步搞定Python性能瓶颈

关爱男性健康新手避坑:3步搞定Python性能瓶颈 官方文档翻了三遍还是没搞懂为什么代码这么慢?别慌,这不是你的错。 很多新手在写Python时,总觉得逻辑通了就行,结果一上线数据量稍微大点,CPU直接飙红。 这就是典型的 新手避坑…

2026/9/22 0:34:56

2026最新怎么快速长头发全栈实战指南

2026最新怎么快速长头发全栈实战指南 刚接手新项目,从 GitHub 或同事电脑里拷来一段代码,运行直接报错 ModuleNotFoundError 或者 SyntaxError…

2026/9/22 0:34:56

社会主义核心价值版本升级后API全变了新手避坑指南

社会主义核心价值版本升级后API全变了新手避坑指南 版本升级后 API 全变了,新手避坑最头疼。 刚拿到新项目,发现旧代码跑不通。 文档还是旧的,报错全是红的。 别慌,这种“社会主义核心价值”在工程界的映射,其实就是…

2026/9/22 0:34:56

se播3个避坑点与完整示例

se播3个避坑点与完整示例 官方文档翻了三遍,还是不知道哪里该改?别慌,这不是你的问题,是资料太散。很多人卡在“se播”这个概念上,其实它核心就两点: 数据同步的稳定性 和 业务逻辑的解耦 。今天不整虚的,直接上干货,给你看几套在…

2026/9/22 0:34:56

360微信编辑器面试避坑指南:5个高频考点拆解

360微信编辑器面试避坑指南:5个高频考点拆解 刚学完前端语法,对着 360 微信编辑器的文档发呆?很多开发者卡在“代码能跑,但不知道如何落地到实际项目”的瓶颈上。这篇避坑指南不讲虚的,直接拆解大厂面试官最爱问的 5…

2026/9/22 0:29:53

3个坑避开!顶级流氓手写实现对比与选型指南

3个坑避开!顶级流氓手写实现对比与选型指南 你是不是也这样?B站视频刷了十个,博客收藏了五十篇,代码跟着敲了一遍,合上电脑问自己:这项目到底怎么跑起来?这种“看会了,手废了”的无力感,是绝大多数开发者从入门到进阶路上最大的拦路虎。教程里的代…

2026/9/21 3:28:31

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/21 3:33:19

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/22 0:04:49

输电线路在线监测高频面试题拆解 3秒抓住官方文档重点

输电线路在线监测高频面试题拆解 3秒抓住官方文档重点 官方文档几百页翻到头还是懵?面试问到 输电线路在线监测 的数据链路时,脑子一片空白?别慌,这种 高频面试题 我整理了10年,专门治各种“文档太长抓不住重点”的毛病。…

2026/9/22 0:04:49

中介房源管理系统重构避坑:3个关键步骤搞定API变更

中介房源管理系统重构避坑:3个关键步骤搞定API变更 版本升级后 API 全变了,这种痛只有真做过的人懂。 很多团队在接手老旧房产项目时,最崩溃的不是代码烂,而是底层框架升级后,原本熟悉的接口调用方式彻底失效。 这份 保姆级教程…

2026/9/22 0:04:49

3个坑点带你一文搞懂55gg小游戏源码

3个坑点带你一文搞懂55gg小游戏源码 盯着控制台满屏的红色报错,看着那一长串 StackTrace ,是不是脑子瞬间宕机?别急,这种时候最忌讳的就是盲目改代码。很多刚入行的前端同学,面对 55gg 小游戏这类轻量级 H5…

2026/9/20 4:54:47

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/21 18:32:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/21 10:29:02

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码