ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Sails v0.11 升级指南:从 v0.10 平滑迁移到 Socket.io v1 时代的完整攻略

Sails v0.11 升级指南:从 v0.10 平滑迁移到 Socket.io v1 时代的完整攻略 后端【免费下载链接】sailsRealtime MVC Framework for Node.js项目地址https://gitcode.com/gh_mirrors/sa/sails点击查看免费下载本篇指南以官方迁移文档 docs/upgrading/To0.11.md 为核心系统梳理 Sails v0.11 相对 v0.10 的破坏性变更onConnect/onDisconnect回调废弃、Socket.io 客户端升级、config 子目录扁平化等与新特性npm 安装用户级 Hook、sails.request()虚拟请求解释器、config/env/环境子目录等并辅以仓库源码佐证底层实现帮助你在不引入不必要的代码改动的前提下安全、高效地完成升级。v0.11 到底改了什么先看 tldrv0.11 是 Sails 在 1.0 之前的一次重要里程碑版本。这次发布带来了大量的小幅改进以及核心内部结构的清理最大的变化是 Sails 核心全面切换到 Socket.io v1。值得庆幸的是官方文档明确表示几乎所有这些改动都不应影响你项目中已有的代码但仍有一些重要的差异和新特性需要注意。也就是说只要你的应用是通过 Sails 自身提供的抽象层如sails.sockets.*包装方法、resourceful pubsub、blueprints来使用 Socket.io 的应用层代码基本无需改动受影响的主要是config/sockets.js配置、浏览器端客户端文件以及使用了底层 socket.io API 的代码。本文接下来的部分将逐一说明这些差异。破坏性变更与迁移要点Differences1. 升级 Socket.io / Sails.io 浏览器客户端Sails v0.11 使用 Socket.io v1 之后旧的 v0.9 socket.io 客户端将不再工作因此你必须将sails.io.js客户端从 v0.9 或 v0.10 升级到 v0.11。最省事的做法是使用 Sails 内置的新生成器。假设你的sails.io.js位于约定的默认位置assets/js/dependencies/sails.io.js即你没有移动或重命名过它只需执行sails generate sails.io.js --force--force参数用于覆盖已有的旧版客户端文件。若你的客户端文件不在默认位置需要先手动调整路径或移回默认位置后再执行上述命令。2.onConnect生命周期回调已废弃tldr直接从config/sockets.js中移除你的onConnect函数。onConnect生命周期回调在 v0.11 中被废弃。它的原始设计目的是性能优化——在 socket 建立连接时免去客户端额外发起一次请求的往返开销。但实际使用中它容易引发逻辑混乱和竞态条件race conditions。官方推荐的替代方案是当需要在新 socket 建立连接后执行某些逻辑时让新连接的客户端主动发送一个初始请求来完成。Socket 请求非常轻量不会给应用带来明显的额外开销而且这种写法能让代码行为更可预测。如果你确实急需消除那次服务器往返例如正面临真正的生产环境性能瓶颈也可以在config/bootstrap.js中直接绑定sails.io.on(connect, function (newlyConnectedSocket) { // 在新 socket 连接时执行的自定义逻辑 });但官方明确不推荐此做法仅在确认存在真实性能问题时才应使用。3.onDisconnect生命周期回调更名为afterDisconnectonDisconnect生命周期回调被废弃取而代之的是afterDisconnect。在旧版本中如果你在onDisconnect中修改了session必须手动调用session.save()才能持久化。在 v0.11 中afterDisconnect的工作方式几乎完全相同唯一区别是它新增了第三个参数回调函数cb。你只需在afterDisconnect的逻辑完成后调用该回调Sails 就会自动持久化你对 session 所做的任何修改——正如普通路由、action 或 policy 中的req.session一样无需再手动调用session.save()。tldr将config/sockets.js中的onDisconnect重命名并改写为afterDisconnect: function (session, socket, cb) { // 在这里编写断开连接后的清理逻辑可修改 session // 务必调用回调让 Sails 自动保存 session 变更 return cb(); }4.config/sockets.js中的其他配置项Socket.io v1 的众多配置选项发生了变化因此需要相应更新你的config/sockets.js。官方给出的迁移清单如下若你从未自定义过config/sockets.js中的任何选项可以安全地删除或注释掉整个文件让 Sails 的默认配置接管一切。多服务器部署且环境不支持 sticky sessions 时包括 Heroku需要在config/socket.js原文如此实际应为config/sockets.js和客户端两端都将transports设置为[websocket]强制使用 WebSocket 传输否则在无粘性会话的负载均衡场景下连接会不稳定。可参考仓库中的 Scaling 文档。自定义authorization函数限制 socket 连接authorization已被 Socket.io v1 废弃应改用beforeConnect。beforeConnect直接映射到 Engine.io 的allowRequest选项工作方式与旧的authorization完全相同。其他直接传给 socket.io 的低层配置请对照 sails.config.sockets 参考文档逐一核对确保所有配置项在新版本下仍然有效。5. firehose 功能被废弃用于 socket 测试的 firehose 特性已被废弃。如果你不知道它是什么那完全不必担心——基础用法短期内仍可工作但它很快会从核心中移除不应再在你的应用里依赖它。受影响的sails.sockets方法包括sails.sockets.subscribeToFirehose()sails.sockets.unsubscribeFromFirehose()sails.sockets.drink()sails.sockets.spit()sails.sockets.squirt()若你的测试代码仍在使用上述方法请尽快迁移到基于具体房间/模型的订阅方式可参考 Resourceful PubSub 文档。6.config子文件夹中的配置文件不再产生命名空间Sails 的设计初衷一直是config文件夹中的文件彼此之间没有优先级文件名和子文件夹local.js以及env、locale子文件夹除外仅用于组织管理。但在旧版本中存在一个非预期的行为将配置文件保存到子文件夹时文件名会被添加为sails.config的一个键。例如把配置存到config/foo/bar.js该配置会被命名空间化为sails.config.bar。这个行为容易造成困惑1) 目录名被忽略config/foo/中的foo不参与命名2) 移动文件位置会改变配置键名。该问题在 v0.11.x 中已修复子文件夹中的配置文件将与根config文件夹中的文件同等对待不再受目录结构影响。如果你出于某种原因仍依赖旧行为可以在.sailsrc文件中设置{ dontFlattenConfig: true }但官方强烈建议不要这样做而是自己显式命名空间配置例如// config/foo.js module.exports.foo { // 你的配置 };关于此改动的更多背景可参考 issue #2544仓库中的相关记录见 CHANGELOG.md。7. Waterline 改用 Bluebird 作为 Promise 库从 v0.11 开始Waterline 使用Bluebird替代原来的 q来实现 Promise 支持。如果你使用的是.exec()回调风格完全不受影响只有使用.then()的 Promise 风格代码才需要注意。迁移时请重点排查模型中涉及.then()链的查询代码。更多细节可参考 docs/version-notes/0.11.x/MigrationGuide0.11.md。新特性一览New features1. 用户级 Hook一条命令从 NPM 安装v0.11 支持直接从 NPM 安装 Hook这意味着你可以通过一条终端命令扩展 Sails 的能力。文档给出的典型例子是autoreloadHook——它会监听后端代码变更使你在修改 controllers、routes、models 等之后无需手动 kill 并重新 lift 服务器npm install sails-hook-autoreload安装后重启 Sails 即可生效。Hook 是 Sails 中最底层的可插拔抽象它允许作者介入 lift 启动流程监听事件注入自定义 shadow 路由直接访问sails运行时。事实上你熟悉的大多数 Sails 功能早已以 core hooks 的形式实现了超过一年包括Hook 名职责blueprints提供蓝图 APIRESTful 路由等sockets提供 Socket.io 集成grunt提供 Grunt 构建集成orm集成 Waterline ORM导入项目的 adapters、models 等http提供 HTTP 服务器其他 16 个诸如request、views、policies、services、session、i18n、security、pubsub、responses、helpers等在 default-hooks.js 中可以找到当前 Sails 核心默认启用的完整 hook 清单。如需编写自己的 Hook可参考仓库中的 Hooks 概念文档 与 hookspec。2. Socket.io v1.x应用层无感升级升级到 Socket.io v1.0不应影响你的应用层代码前提是你使用的是 Sails 自己提供的抽象层——从sails.sockets.*包装方法到 resourceful pubsub、blueprints 一路往上都是安全的。只有当你直接在应用中使用底层 socket.io 方法或对 Socket.io v1.0 的技术细节感兴趣时才需要关注 Socket.io 官方迁移指南中的变化如authorization→beforeConnect、配置项变更等。3. 日益增长的模块化sockets Hook 独立成仓作为升级到 Socket.io v1.0 的一部分核心的socketsHook 被抽取到了独立的仓库中维护。这样做的好处是可以为 socket.io 解释器编写模块化、Hook 专属的测试使 Hook 更容易维护、定制和覆盖让 Hook 可以按自己的节奏独立演进相关 issue 也集中到一处。这可以看作未来几个月内将其他 Hook 陆续抽出核心仓库的一次试点。长远来看这将使 Sails 核心更轻量、启动lift时间更短、npm install更快、依赖更少、扩展性更强。从 default-hooks.js 的注释中可以看到当前仓库仍为sockets、orm、grunt等 Hook 保留了历史插入位置的说明性注释。4. 虚拟请求解释器与sails.request()方法在将socketsHook 从核心抽出的过程中解释请求的逻辑被规范化并移入 Sails 核心这使得sails.request()方法变得更加强大。sails.request()允许你不把服务器 lift 到某个端口上直接与 Sails 的请求解释器通信。这正是 Sails 将来自 Socket.io 的入站消息映射为带有熟悉req/res流的 virtual requests虚拟请求所用的同一套机制。它的主要用途是编写运行更快的单元测试和集成测试也可用于代理到挂载应用sub-apps。从源码实现 lib/app/request.js 可以看到其内部细节支持两种调用形式sails.request(opts, cb)opts.url、opts.method、opts.params、opts.headers和sails.request(address, [params], cb)若 URL 包含 HTTP 动词前缀如get /foo/bar会自动解析出 method对 GET、HEAD、DELETE 请求会将 body 参数序列化进 querystring内部通过一个MockClientResponseTransform 流模拟 HTTP 客户端响应并在响应完成后按content-type自动解析 JSON body当状态码不在 200~399 区间时会将错误作为回调的第一个参数返回并附带error.body与error.status。以下是官方文档提供的、基于 mocha 的完整测试示例var assert require(assert); var Sails require(sails).Sails; before(function beforeRunningAnyTests (done){ // 加载应用无需 lift 到端口 sails.load({ log: { level: warn }, hooks: { grunt: false } }, function whenAppIsReady(err){ if (err) return done(err); // 此时 sails 全局对象已暴露你也可以在 sails.load() 的配置覆盖中将其禁用。 // 事实上你可以用这种技术设置任何你想要的配置项。 return done(); }); }); after(function afterTestsFinish (done) { sails.lower(done); }); describe(GET /hotpockets, function (){ it(should respond with a 200 status code, function (done){ sails.request({ method: get, url: /hotpockets, params: { limit: 10, sort: price ASC } }, function (err, clientRes, body) { if (err) return done(err); assert.equal(clientRes.statusCode, 200); return done(); }); }); });几点实战提示sails.load()与sails.lift()的区别在于前者不会绑定端口适合测试场景测试结束时用sails.lower(done)优雅关闭通过hooks: { grunt: false }可以禁用 Grunt 钩子显著加快测试启动速度仓库的基准测试 test/benchmarks/sails.request.generic.test.js 和 test/benchmarks/sails.load.test.js 也基于这一机制可作为参考实现。5.config/env/环境子文件夹v0.10.x 中引入了config/env文件夹感谢 clarkorz 的贡献你可以在其中放置仅当处于特定环境时才加载的配置文件如config/env/production.js、config/env/development.js等。v0.11.x 在此基础上增加了按环境指定整个子文件夹的能力。例如当环境为production时config/env/production目录下的所有配置文件都会被加载并合并到其他配置之上。合并优先级规则如下config/env/production子文件夹中的配置config/env/production.js文件若文件夹和同名 .js 文件同时存在.js文件优先级更高config/local.js始终合并到所有其他文件之上.sailsrc的优先级最高统领一切优先级从低到高 config/ 根目录文件 → config/env/环境/ 子文件夹 → config/env/环境.js 文件 → config/local.js → .sailsrc最高升级操作总览与自检清单综合以上内容从 v0.10 升级到 v0.11 的建议步骤为升级sails.io.js浏览器客户端sails generate sails.io.js --force清理config/sockets.js删除onConnect将onDisconnect改为带cb回调的afterDisconnect核对transports、beforeConnect等配置项检查测试代码弃用 firehose 相关方法drink/spit/squirt等若使用.then()确认兼容 Bluebird检查配置目录确认config子文件夹中的配置是否依赖旧的命名空间行为如有则改为显式module.exports.foo {...}尝试新特性通过npm install sails-hook-autoreload体验用户级 Hook用sails.request()加速测试。官方迁移指南 docs/version-notes/0.11.x/MigrationGuide0.11.md 与本篇内容一致可作为升级时的对照参考docs/upgrading/upgrading.md 则说明了 Sails 各版本之间的升级顺序建议——如果你落后多个版本最好逐版本升级例如先到 v0.11再到 v0.12最后到 v1.0以便隔离变量、降低排查难度。常见问题Q升级后浏览器端连接失败怎么办A确认sails.io.js客户端已升级到 v0.11旧 v0.9 客户端在 Socket.io v1 下无法工作并检查config/sockets.js中是否有旧的配置项需要按新格式迁移。QonConnect中的初始化逻辑迁移到哪A在客户端 socket 连接成功后主动向服务器发送一个初始化请求如请求当前用户信息、初始化订阅等在对应路由/action 中处理该逻辑。Q多服务器如 Heroku部署要注意什么A在不支持 sticky sessions 的环境中必须在服务端与客户端两侧都设置transports: [websocket]详见 Scaling 文档。Q我的查询代码用了.then()升级后行为有变化吗AWaterline 的 Promise 实现从 q 换成了 Bluebird.then()的行为细节可能略有差异如错误处理、方法集建议在升级后回归测试所有 Promise 风格的查询代码使用.exec()则无需改动。赞分享后端【免费下载链接】sailsRealtime MVC Framework for Node.js项目地址https://gitcode.com/gh_mirrors/sa/sails点击查看免费下载相关推荐Astro版本升级终极指南从v1到v4平滑迁移全攻略Astro版本升级终极指南从v1到v4平滑迁移全攻略 Astro是一款专注于内容驱动网站的现代Web框架本指南将帮助你从v1版本无缝升级到最新的v4版本体前端Web框架SSR前端构建Go XLSX库终极迁移指南从v1到v4的平滑升级攻略Go XLSX库终极迁移指南从v1到v4的平滑升级攻略 如果你正在使用Go语言处理Excel文件那么tealeg/xlsx库绝对是你的不二之选 这个强后端Sails v1.0 升级迁移指南从 0.12.x 平滑升级到 v1.0 的完整实操手册Sails v1.0 升级迁移指南从 0.12.x 平滑升级到 v1.0 的完整实操手册 Sails v1.0本仓库版本为 1.5.18是对 Node.j后端上一篇Midscene.js 2025视觉驱动的UI自动化范式迁移与架构革命下一篇解决OBS Studio图形钩子调试符号缺失问题从崩溃到流畅直播的实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表