新闻详情

新闻详情

首页 / 资讯中心 / 详情

AdminJS flat.filterOutParams 完全指南:从扁平化参数中精准移除嵌套字段

发布时间:2026/9/25 5:10:31来源:尧图网络
AdminJS flat.filterOutParams 完全指南:从扁平化参数中精准移除嵌套字段
后端低代码【免费下载链接】adminjsAdminJS is an admin panel for apps written in node.js项目地址https://gitcode.com/gh_mirrors/ad/adminjs点击查看免费下载导读flat.filterOutParams是 AdminJS 中flat模块提供的参数过滤工具用于从扁平化flatten的params对象中按路径移除一个或多个属性。在 AdminJS 后端处理数据库记录、前端表单提交的扁平化 payload 时经常需要剔除敏感字段、隐藏嵌套属性或剥离数组元素filterOutParams正是应对这一场景的精准减法工具。读完本文你将掌握其用法、嵌套路径匹配规则、多属性批量移除技巧以及底层正则实现原理并能在实际 AdminJS 项目中正确选用它与selectParams、removePath等兄弟工具。一、为什么需要 filterOutParamsAdminJS 的扁平化数据模型AdminJS 后端将所有数据库表/集合的信息存放在BaseRecord.params对象中前端则对应RecordJSON.params。为支持 JSONB 嵌套列、Mixed Schema 以及数组数据AdminJS 在写入params前会对所有数据做扁平化flatten处理如 flat.doc.md 所描述params: { name: John, surname: Doe, age: 28, // 嵌套对象 auth.facebook: some login token, auth.twitter: twitter login token, // 数组 interests.0: running, interests.1: jogging, }在这种扁平结构下顶层键是普通的name而嵌套字段的键名由路径 .分隔符拼接而成。这意味着按顶层键删除这类简单操作无法直接完成——要删除auth下所有字段需要匹配auth.facebook、auth.twitter等一系列以auth.开头的键。flat.filterOutParams正是为此设计的以路径为维度、以正则匹配为手段一次性移除某个路径及其全部子树对应的扁平键。二、基本用法与文档示例filterOutParams接收两个参数参数类型说明paramsFlattenParams扁平化的参数对象{ [key: string]: string \| boolean \| number \| Date \| null \| [] \| Recordstring, unknown \| File }见 flat.types.tspropertiesstring \| Arraystring要移除的属性路径可以传单个路径字符串也可以传路径数组批量移除返回值是一个新的FlattenParams对象其中所有匹配路径的键均被剔除。原文档给出的核心示例import flat from adminjs const params { name: John, education.school.name: Harvard, education.school.id: 123, } flat.filterOutParams(params, education.school) // 结果 { // name: John, // } flat.filterOutParams(params, name) // 结果 { // education.school.name: Harvard, // education.school.id: 123, // }可以看到传入education.school时不仅education.school本身若存在被移除所有以education.school为前缀的深层键如education.school.name、education.school.id也一并删除而传入顶层键name时由于扁平结构中只有name这一个键匹配其余嵌套键原样保留。注意原文档中第二个示例的调用名拼写为flat.filterOurParamstypo实际 API 为flat.filterOutParams。当前仓库中该函数在 filter-out-params.ts 定义并已挂载到 flat-module.ts 的flat命名空间导出可直接import { flat } from adminjs使用。三、嵌套路径与数组索引匹配规则详解扁平化数据的键名可能涉及深层嵌套与数组索引例如nested.1.property.0。filterOutParams的匹配依赖内部的正则生成器propertyKeyRegex见 property-key-regex.ts// 以 . 为分隔符构建形如 ^path($|\.) 的锚定正则 const escapedDelimiterOrIndex (${escapedDelimiter}|${escapedDelimiter}\\d${escapedDelimiter}) // includeAllSiblings 为真时路径中的 . 被替换为 (\.|\.\d\.)默认情况下传入的路径中的每个.会被替换为转义的\.最终生成^path($|\.)形式的正则即精确匹配路径本身或以路径 .开头的所有键。这正是education.school能同时命中education.school.name的原因。对于数组路径propertyKeyRegex支持includeAllSiblings选项由GetOptions定义意为包含所有同层兄弟元素。例如键nested.0.array.0与nested.1.array.0若想移除nested下所有数组分支的同名叶子可以借助该选项。不过filterOutParams的当前签名仅接收params与properties其内部调用propertyKeyRegex(propertyPath)时不传options因此默认按路径前缀 分隔符的严格子树匹配执行需要更灵活的兄弟级匹配时可参考其姊妹函数selectParams见下文后者完整支持GetOptions。四、批量移除传入字符串数组当需要一次性剔除多个属性时properties参数可以直接传入路径数组。看仓库测试 filter-out-params.spec.ts 中的真实用例const params { name: John, surname: Doe, age: 31, meta.description: very ugly, meta.title: cto, meta.otherInfo: he stinks, metadetaksamosone: this is a steroid, } flat.filterOutParams(params, [name, meta]) // 结果 { // surname: Doe, // age: 31, // metadetaksamosone: this is a steroid, // }几个值得注意的边界行为均有测试佐证数组内部顺序无关紧要[name, meta]与[meta, name]结果一致因为每个路径独立生成正则并依次过滤。前缀误伤防护移除meta不会误伤metadetaksamosone。原因在于生成的正则是^meta($|\.)metadetaksamosone不满足meta 后紧跟.或行尾的锚定条件这正是路径 分隔符匹配比简单startsWith更严谨的体现。无匹配时原样返回传入不存在的路径如nothingIsThere时函数返回与原对象相等deep.eq的副本不会抛错。undefined路径安全数组中混入undefined不会抛异常。这得益于源码中先执行propertyArray.filter((propertyPath) !!propertyPath)将空路径过滤掉后再进行归约见 filter-out-params.ts。五、源码实现剖析一行行看 filterOutParams 做了什么const filterOutParams ( params: FlattenParams, properties: string | Arraystring, ): FlattenParams { const propertyArray Array.isArray(properties) ? properties : [properties] return propertyArray .filter((propertyPath) !!propertyPath) .reduce((globalFiltered, propertyPath) { const regex propertyKeyRegex(propertyPath) return Object.keys(globalFiltered) .filter((key) !key.match(regex)) .reduce((memo, key) { memo[key] (params[key] as string) return memo }, {} as FlattenParams) }, params) }核心逻辑分四步参数归一化Array.isArray(properties) ? properties : [properties]将单个字符串包装为数组统一走数组流程。空路径过滤.filter((propertyPath) !!propertyPath)剔除空字符串、undefined等 falsy 路径保证后续propertyKeyRegex不会拿到非法输入。逐路径归约以params为初始值对每个路径生成对应的propertyKeyRegex然后遍历当前累积对象的全部键用!key.match(regex)保留不匹配的键。重建对象每个保留的键通过memo[key] params[key]复制到新对象最终返回全新的FlattenParams——原对象不会被修改符合函数式工具的设计预期。值得注意的是第 3 步中Object.keys(globalFiltered)与params[key]的配合由于归约链是串行的每一轮都基于上一轮过滤后的键集合继续过滤而取值始终来自原始params从而保证批量移除时不会因中间状态丢失而误取 undefined 值。六、与 selectParams、removePath 的分工协作flat模块是一组互补的工具导出见 flat-module.ts理解它们的边界能帮你写出更精准的代码selectParams正选与filterOutParams恰好相反保留匹配路径的键、丢弃其余。其源码 select-params.ts 与filterOutParams几乎镜像唯一差异是key.match(regex)与!key.match(regex)且selectParams额外支持GetOptions如includeAllSiblings。需要只要某子树时用它需要剔除某子树时用filterOutParams。removePath定点删除当路径涉及数组索引时单纯过滤键是不够的。以property.0 / property.1 / property.2三个键为例删除property.1不仅要移除该键还应把property.2重命名为property.1以保持数组下标连续。removePath在 remove-path.ts 中正是基于filterOutParams做第一层过滤再通过pathToParts、get、set检测数组父节点并执行splice重排。因此普通嵌套属性、对象子树→filterOutParams数组元素、需要保序压缩的路径→removePath批量剔除多个顶层/嵌套字段→filterOutParams(params, [a, b])或removePath逐个调用七、实际使用场景建议结合 AdminJS 的数据流filterOutParams的典型应用包括API 响应脱敏在自定义 action 返回记录前剔除auth.*、password.*等敏感路径避免扁平化 payload 将嵌套凭据一并带出。编辑场景的字段白名单减法配合selectParams使用先正选允许编辑的路径再反选其中需要排除的子路径形成精确的字段集合。前端表单同步RecordJSON.params是扁平结构修改某一子树后可用filterOutParams生成应删除部分的 payload与后端set/merge工具配合完成局部更新。调用方式统一为import { flat } from adminjs即 index.js 暴露的顶层入口函数本身纯函数、无副作用返回全新对象可放心用于状态管理场景。八、结语flat.filterOutParams以路径前缀 分隔符锚定的正则匹配解决了扁平化数据模型下删除一个字段 删除其整棵子树的难题并通过数组参数支持批量剔除、通过空路径过滤保证健壮性。结合 filter-out-params.spec.ts 中的测试用例嵌套删除、多属性删除、无匹配、undefined 路径你可以放心地在自己的 AdminJS 项目中复用这一模式当目标涉及数组索引时再升级到 remove-path.ts 的flat.removePath即可。赞分享后端低代码【免费下载链接】adminjsAdminJS is an admin panel for apps written in node.js项目地址https://gitcode.com/gh_mirrors/ad/adminjs点击查看免费下载相关推荐AdminJS flat.selectParams 完全指南从扁平化 params 中精确提取嵌套字段AdminJS flat.selectParams 完全指南从扁平化 params 中精确提取嵌套字段 AdminJS 在前后端之间以「扁平化」形式传输记录数后端低代码Apache Druid JSON Flatten Spec 完全指南在摄入期将嵌套 JSON 字段扁平化为列Apache Druid JSON Flatten Spec 完全指南在摄入期将嵌套 JSON 字段扁平化为列 JSON Flatten Spec扁平化规范数据库数据分析OLAP大数据实时分析数据仓库后端Akka Streams 嵌套与扁平化算子Nesting and Flattening Operators完全指南Akka Streams 嵌套与扁平化算子Nesting and Flattening Operators完全指南 Akka Streams 提供了一组将“后端并发编程异步编程上一篇推荐开源项目Quazip - 集成Qt的ZIP/UNZIP库封装下一篇Python Redis Lock分布式锁的强力助手创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

企业流程管理数字化转型:从流程建模到运营优化的落地指南 2026/9/25 8:02:11

企业流程管理数字化转型:从流程建模到运营优化的落地指南

简介:一份关于企业流程管理的数字智慧方案PPT,共76页,面向企业管理者、流程优化人员及数字化转型相关从业者,系统讲解如何通过流程管理打破部门壁垒、提升组织效率。资源为1个pptx文件,压缩包约814KB。整套内容按七大模…

阅读更多 →
VulnTarget-B综合靶机渗透测试实战:从信息收集到提权全流程解析 2026/9/25 8:02:11

VulnTarget-B综合靶机渗透测试实战:从信息收集到提权全流程解析

VulnTarget-B 是我搭在自己实验环境里的一台综合靶机,主要用来练手渗透测试全流程。最近又完整地把它打了一遍,从信息收集到内网提权、权限维持、痕迹清理都走了个遍,顺手把报告整理了出来。这篇文章就相当于把“进攻路径”从头讲一遍&#x…

阅读更多 →
楚慧杯初赛Writeup:从SQL注入绕过到隐写与RSA攻击的CTF实战 2026/9/25 8:02:11

楚慧杯初赛Writeup:从SQL注入绕过到隐写与RSA攻击的CTF实战

第十届“楚慧杯”初赛考完那天晚上,我在群里看到好几个参赛队都在问同一道Web题,当时心里就有点数了——今年的初赛跟往年不一样,题目明显往实战对抗和数据安全方向倾斜了。趁着Flag的截图和解题脚本还没吃灰,我把整场参赛过程的思…

阅读更多 →
django-debug-toolbar 示例工程全解:从一条 make 命令到异步 ASGI 服务的可复现调试环境 2026/9/25 8:02:11

django-debug-toolbar 示例工程全解:从一条 make 命令到异步 ASGI 服务的可复现调试环境

后端开发工具调试器 【免费下载链接】django-debug-toolbar A configurable set of panels that display various debug information about the current request/response. 项目地址: https://gitcode.com/gh_mirrors/dj/django-debug-toolbar 点击查看 免费下载 d…

阅读更多 →
高效记忆训练:科学原理与多感官实践方法 2026/9/25 8:02:11

高效记忆训练:科学原理与多感官实践方法

1. 记忆科学的基础原理人类大脑的记忆系统就像一座精密的图书馆,信息需要经过编码、存储和提取三个关键环节。海马体作为记忆的"中转站",负责将短期记忆转化为长期记忆。这个过程需要神经突触的可塑性变化,专业术语称为"长时程…

阅读更多 →
Cloudflare开源Security Audit Skill:让Codex变身安全审计工程师 2026/9/25 8:02:04

Cloudflare开源Security Audit Skill:让Codex变身安全审计工程师

前阵子在跑一次例会前的代码安全自查,我对着几十个diff挨个看输入过滤和越权点,看到一半就开始怀疑人生。正好那几天在折腾Codex,突发奇想让AI帮我拉一遍风险点,结果它给出的反馈停留在“这个函数看起来没问题”“建议增加错误处理…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉