ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Sails 全局变量(Globals)完全指南:`sails`、模型、服务、Lodash 与 Async 的暴露机制与禁用方案

2026/9/20 22:35:53 拓冰建站 浏览量
Sails 全局变量(Globals)完全指南:`sails`、模型、服务、Lodash 与 Async 的暴露机制与禁用方案 后端【免费下载链接】sailsRealtime MVC Framework for Node.js项目地址https://gitcode.com/gh_mirrors/sa/sails点击查看免费下载Sails 框架为提升开发效率默认在全局作用域暴露sails应用对象、你的模型Model与服务Service以及_Lodash和async两套常用工具库。本文将系统梳理这些全局变量的默认行为、底层实现机制并给出通过sails.config.globals惯例上配置于config/globals.js逐个禁用或整体关闭的完整实战方案帮助你在编写控制器、策略policy与脚本时正确选用全局变量或在追求模块化与可测试性的场景下优雅地绕开它们。为什么 Sails 要暴露全局变量在 Sails 应用中后端代码控制器、模型、策略等里到处都需要访问应用实例、ORM 模型和业务服务。若每次都手动require代码会变得冗长。为此Sails 默认暴露少量精心挑选的全局变量让你可以在任意后端代码中按名称直接引用前提是 Sails 已经完成加载。需要特别强调的是Sails 核心自身不依赖任何这些全局变量——每一个由 Sails 暴露的全局变量都可以在sails.config.globals中被禁用参见 DisablingGlobals 指南。这意味着全局变量纯粹是开发便利设施而不是框架运转的必要条件。Sails 默认暴露的全局变量一览全局变量含义默认值sails代表当前应用的 Sails 实例App Object启用你的模型按模型的globalId暴露如api/models/Foo.js暴露为Foo启用你的服务按服务的globalId暴露如api/services/Baz.js暴露为Baz启用_Lodash 实例sails.config.globals 中默认require(lodash)启用asyncAsync 实例默认require(async)启用应用对象sails大多数情况下你希望sails全局可用它让应用代码干净很多sails.config、sails.models、sails.log、sails.getActions()、sails.getRouteFor()等应用级 API 都可以通过它直接触达详见 应用参考文档。如果你确实需要禁用包括sails在内的全部全局变量仍有两种途径拿到应用实例在请求request对象上通过req._sails访问在 action 中通过env.sails访问。模型与服务Models and Services你的模型和服务是以各自的globalId暴露为全局变量的。例如定义在api/models/Foo.js的模型全局可访问为Foo定义在api/services/Baz.js的服务全局可访问为Baz。globalId默认由文件名推导而来。若关闭了相应全局变量你依然可以通过sails.models以 identity 为键的字典访问全部模型通过sails.services访问全部服务——这正是全局变量只是便利设施的最佳例证。工具库Lodash_与 AsyncasyncSails 默认附带 Lodash 与 Async 的实例并暴露为_和async目的是让你在每个新项目中不必重复npm install这些常用工具。与其它全局变量一样它们也可以被禁用。配置入口config/globals.js与sails.config.globals全局变量的开关集中在sails.config.globals配置项中惯例上写在 config/globals.js 文件里。完整的配置属性说明见 sails.config.globals 参考文档其支持的属性如下属性类型默认值说明_下划线引用ref或布尔值require(lodash)将指定的 lodash 实例暴露为全局_设为false则完全禁用_全局async引用ref或布尔值require(async)将指定的 async 实例暴露为全局async设为false则完全禁用models布尔值true将应用的每个模型按globalId暴露为全局变量禁用后仍可通过sails.models按 identity 访问sails布尔值true暴露代表应用的sails实例禁用后仍可在 action 中通过env.sails、在 policy 中通过req._sails获取services布尔值true将应用的每个服务按globalId暴露为全局变量禁用后仍可通过sails.services访问禁用全部或部分全局变量方案一整体关闭最简单将所有全局变量一次性全部禁用只需将sails.config.globals整体设为false这与手动逐个关闭上面所有配置项的效果完全相同// config/globals.js module.exports.globals false;方案二逐个关闭只关闭一部分全局变量时改为传入一个配置对象// config/globals.js module.exports.globals { _: false, async: false, models: false, services: false };以上配置会禁用 Lodash、Async、模型和服务四类全局仅保留sails。若连sails也想去掉把sails: false一并加上即可。底层实现Sails 是如何暴露这些全局变量的全局暴露的入口exposeGlobals()全局暴露的核心逻辑位于 lib/app/private/exposeGlobals.js 的exposeGlobals()私有方法中它在 Sails 加载过程中被调用。从源码可以梳理出几条关键规则未配置时的隐式默认值是false当sails.config.globals未定义时Sails 会直接将其置为false即不暴露任何全局变量。这是为了支持在自动化测试、命令行脚本、定时任务中更直观地以编程方式调用sails.lift()/sails.load()参见 Programmatic Usage 指南。注意这与sails new生成的模板项目行为不同——模板项目的config/globals.js会显式声明启用哪些全局。非法配置直接抛错sails.config.globals若既不是false也不是普通对象字典会抛出E_BAD_GLOBAL_CONFIG错误。逐项校验并写入 Node 全局对象sails.config.globals._必须是false或一个对象通常是require(lodash)得到的函数对象校验通过后执行global[_] sails.config.globals._sails.config.globals.async同理必须是false或对象通过后执行global[async] ...sails.config.globals.sails必须是布尔值为true时执行global[sails] sailssails.config.globals.models必须是布尔值真正的模型全局化交由 orm 钩子hook完成。这意味着 Sails v1 中把_或async设为true是非法的——它们必须指向一个真实的库实例或为false源码注释也明确要求必须是false或本地安装的 Lodash/Async 版本。服务的全局化services 钩子服务全局变量的实际写入发生在 lib/hooks/services/index.js 中。该钩子先把所有服务挂到sails.services上保证即使禁用全局也能访问随后检查sails.config.globals.services是否开启若开启则遍历每个服务按service.globalId || service.identity || identity的优先级确定全局名并写入global[globalId]// lib/hooks/services/index.js节选 if (sails.config.globals.services) { _.each(sails.services, function(service, identity) { var globalId service.globalId || service.identity || identity; global[globalId] service; }); }模型与适配器的全局化则由 orm 钩子负责正如exposeGlobals()源码注释所言orm hook takes care of actually globalizing models and adapters (if enabled)。使用自定义版本的 Lodash 与 Async升级/替换为其它版本Sails 1.0 生成的新项目默认安装并全局启用了 Lodash 与 Async其效果等同于在config/globals.js中写入// config/globals.js module.exports.globals { _: require(lodash), async: require(async) };要换用你想要的版本只需安装目标版本即可。例如安装最新版 Lodash 4.xnpm install lodash^4.x.x --save --save-exact注意在 Sails v1.0 之前_和async可以设为true该写法已被弃用替换为上述传入真实库实例的语法。禁用全局后手动require如果因项目规范必须禁用全局但仍想使用 Lodash/AsyncNode.js 的模块机制让这件事非常简单。先在config/globals.js中关闭对应全局// config/globals.js module.exports.globals { // 禁用 _ 和 async 全局变量 _: false, async: false };再在项目里安装自己的依赖npm install lodash --save --save-exact # 或 npm install async --save --save-exact最后像引入任何其它 Node.js 模块一样在需要它们的每个文件顶部手动引入var _ require(lodash); var async require(async);重要注意事项加载时机有一个容易踩坑的点必须牢记包括sails在内的所有全局变量都要等到 Sails 完成加载之后才可用。换句话说在函数体之外、模块顶层直接使用sails.models.user或User会失败——因为此时sails还没有加载完毕。这也是为什么模型、控制器中的顶层代码只做module.exports声明而把实际访问放在函数内部的原因。测试佐证全局变量行为的自动化验证仓库中的 test/integration/globals.test.js 对这一整套行为做了完整的集成测试可作为你验证配置效果的参照。该测试覆盖的场景包括无任何配置的编程式加载sails.load()不暴露async、_、services、models、sails任何全局——印证源码中隐式默认false的逻辑sails new生成的标准应用暴露_、services测试中为Foo、models测试中为User与sails全局但不再暴露async自定义 lodash/async用伪造的node_modules/sailshq/lodash与node_modules/async替换后_全局会使用自定义版本测试断言Object.keys(_)包含foo而非 lodash 原生方法名全部设为false_、async、models、sails、services 均不再暴露非法配置_、async设为true、models/sails缺失即undefined、sails.config.globals整体设为true等场景均断言应用启动失败并抛出E_BAD_GLOBAL_CONFIG。测试中模型Usermodels与服务FooServices的globalId验证也与按globalId暴露全局的文档描述一一对应你可以直接阅读该测试文件了解完整的验证矩阵。小结Sails 的全局变量机制在开箱即用的开发体验与可测试、可模块化的工程实践之间提供了平滑的过渡带默认启用、可按项关闭、可一键全关且关闭后所有能力都能通过sails实例sails.models、sails.services或req/env重新获得。理解 exposeGlobals.js 的校验与写入逻辑、services 钩子的全局化分工以及 globals.test.js 中的行为边界你就能在自己的 Sails 项目中精准控制全局作用域既不牺牲编码效率也不污染运行时环境。赞分享后端【免费下载链接】sailsRealtime MVC Framework for Node.js项目地址https://gitcode.com/gh_mirrors/sa/sails点击查看免费下载相关推荐Sails 全局变量禁用指南通过 sails.config.globals 精确控制 sails、models、services、_ 与 asyncSails 全局变量禁用指南通过 sails.config.globals 精确控制 sails 、 models 、 services 、 _ 与 asyn后端Sails Generators 完全指南理解并扩展 sails new 与 sails generateSails Generators 完全指南理解并扩展 sails new 与 sails generate Sails 作为一个实时 MVC 框架与任何框架后端ESLint no-restricted-globals 规则完全指南禁用指定全局变量与全局对象访问ESLint no restricted globals 规则完全指南禁用指定全局变量与全局对象访问 本指南系统讲解 ESLint 核心规则 no restr开发工具Lint静态分析代码质量上一篇如何掌握 lint-staged 配置文件解析逻辑从 configFiles.js 到高效工作流下一篇CANN/ops-tensor矩阵乘法StreamK块调度器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考