后端【免费下载链接】sailsRealtime MVC Framework for Node.js项目地址https://gitcode.com/gh_mirrors/sa/sails点击查看免费下载导读res.location(url)是 SailsRealtime MVC Framework for Node.js中基于 Express 4 提供的响应对象res方法用于将 HTTP 响应头的Location字段设置为指定的 URL 表达式。在 Sails 应用的 Action、Helper 与 Policy 中该方法常被用于自定义重定向目标、配合res.redirect()输出跳转地址或主动告知客户端目标资源的位置。读完本文你将掌握res.location()的用法、五种 URL 表达式形式、与res.redirect()的关系、底层实现原理及测试验证方式从而在自己的 Sails 应用中正确、精准地控制Location响应头。方法概览res.location()由 Sails 直接继承自其底层的 Express 4 运行时当前仓库package.json中声明依赖express: 4.22.2因此行为与 Express 官方实现保持一致。作用将响应头Location设置为给定的 URL 表达式url适用范围HTTP 请求在 Sails 的虚拟请求解释器与真实 HTTP 服务器中均可用特性只设置响应头不会终止请求、不会发送响应体也不会执行跳转。提示res.location()被列为 Sails 自定义响应api/responses/下文件的保留键名之一。在 lib/hooks/responses/index.js 中可以看到包括location在内的view、status、set、get、redirect、send、json等键都被禁止用于自定义响应命名否则会触发invalidCustomResponse错误。因此请不要在api/responses/目录下创建名为location.js的自定义响应文件。语法res.location(url);参数类型说明url((string))要写入Location响应头的 URL 表达式支持绝对 URL、域相对、路径相对与back等多种形式见下文。该方法不返回值即返回undefined调用后需通过后续的响应方法如res.send()、res.status()等真正把响应发送给客户端。支持的 URL 表达式形式res.location()支持与res.redirect()完全相同的 URL 表达式语法原文档明确说明You can use the same kind of URL expressions as inres.redirect()。综合 docs/reference/res/res.redirect.md 中的详细说明共有以下五种形式1. 完全限定的绝对 URLres.location(http://example.com);用于指定包含协议与域名的完整地址通常指向站外资源或另一个域名下的页面。2. 域相对 URL以/开头res.location(/foo/bar);以单个/开头指向当前域名下的某个路径。例如请求位于http://example.com/admin/post/new时/foo/bar会解析为http://example.com/foo/bar。3. 路径相对 URL不以/开头res.location(foo/bar);以当前请求的 URL 路径为基准进行相对解析。例如请求位于http://example.com/admin/post/new时foo/bar会解析为http://example.com/admin/post/foo/bar即相对于当前路径的父目录拼接。4. 目录回溯..res.location(../login);使用..向上回溯一级路径。例如请求位于http://example.com/admin/post/new时../login会解析为http://example.com/admin/login。5. 返回跳转backres.location(back);特殊值back表示回到来源页。Sails/Express 会优先读取请求头Referer或Referrer作为跳转目标若该头部缺失则默认回退到/。这与res.redirect(back)的行为完全一致。完整示例// api/controllers/example-controller.js示意 module.exports { setLocationHeader: function (req, res) { // 绝对 URL res.location(http://example.com); // 域相对路径 res.location(/foo/bar); // 路径相对路径 res.location(foo/bar); // 目录回溯 res.location(../login); // 返回来源页 res.location(back); // 以上调用仅设置 Location 头最终仍需发送响应 return res.send(done); } };注意res.location()只会写响应头。若想真正执行 HTTP 跳转返回 302/301 状态码并通知浏览器访问新地址请使用res.redirect()详见 docs/reference/res/res.redirect.md。在 Sails 中res.redirect()内部正是通过先调用res.set(Location, address)设置头部再以 302 状态码发送响应体的方式实现见下文源码级原理。与res.redirect()的关系原文档指出res.location()支持与res.redirect()完全相同的 URL 表达式。二者的区别在于方法是否写Location头是否发送响应是否终止请求res.location(url)✅❌❌res.redirect(url)✅✅默认 302✅建议配合return使用res.redirect()在 docs/reference/res/res.redirect.md 中被称为终止性方法terminal即通常应是某个请求处理流程的最后一行代码官方文档因此建议使用return res.redirect(url)的写法。而res.location()则适合需要先设置 Location 头再自行决定如何发送响应的场景例如// 先设置跳转目标再自定义状态码与响应体 res.location(/checkout); return res.status(301).send(Moved Permanently);源码级原理1. Sails 对res.redirect()的实现虽然res.location()本体来自 Express但 Sails 在虚拟请求解释器中提供了与 Express 语义一致的res.redirect()实现见 lib/router/res.js// res.redirect() res.redirect res.redirect || function _redirectShim (address, noLongerSupported) { if (!_.isUndefined(noLongerSupported)) { throw new Error(The 2-ary usage of res.redirect() is no longer supported in Express 4/Sails v1. Please use res.status(statusCode).redirect(address) instead.); } // For familiarity, set content-type header: res.set(content-type, text/html); // Set location header res.set(Location, address); return res.status(res.statusCode||302).send(Redirecting to encodeURI(address)); };从该实现可以看出Location 头的写入通过res.set(Location, address)完成这与res.location()的底层效果等价默认状态码若未通过res.status()预先设置状态码则默认返回 302临时重定向不再支持旧式调用Sails v1 / Express 4 中res.redirect(301, url)这种把状态码作为第一参数的双参数写法已被禁止应改用res.status(301).redirect(url)响应体会发送Redirecting to encodeURI(address)的 HTML 文本。2. 响应对象的构建与传输兼容res对象由 lib/router/res.js 中的_buildResponse()工厂构建它确保res.headers、res.locals存在并支持将响应流pipe到客户端虚拟请求解释器场景。由于 Sails 实现了传输无关的请求解释器transport-agnostic request interpreterAction 中的同一份代码既可用于 HTTP也可用于 WebSocket不过Location头这类面向 HTTP 的头部在 WebSocket 场景下语义有限——Sails 文档docs/reference/res/res.md指出res.redirect()对 WebSocket 请求只会返回状态码与Location头由客户端代码自行决定如何处理重定向。3. 保留键名保护Sails 的 responses hook 在加载自定义响应时会检查其命名是否与内置/保留的res方法冲突lib/hooks/responses/index.js 中明确列出了location为保留键。因此用户自定义响应不得命名为location避免覆盖 Express 提供的该方法。测试验证仓库测试 test/unit/virtual-request-interpreter.test.js 直接验证了Location响应头的写入行为describe(res.redirect(), function (){ it(should support creamy vanilla usage, function (done) { app.get(/res_redirect/1, function (req, res) { return res.redirect(/foo/bar); }); app.request(GET /res_redirect/1, {}, function (err, resp, data) { assert(!err, err); assert.deepEqual(resp.headers.Location, /foo/bar); assert.deepEqual(302, resp.statusCode); done(); }); }); it(should honor .status(), function (done) { app.get(/res_redirect/2, function (req, res) { return res.status(301).redirect(/foo/baz); }); app.request(GET /res_redirect/2, {}, function (err, resp, data) { assert(!err, err); assert.deepEqual(resp.headers.Location, /foo/baz); assert.deepEqual(301, resp.statusCode); done(); }); }); });该测试从侧面印证了Location头的设置结果可被客户端读取res.redirect(/foo/bar)后响应头Location的值为/foo/bar且状态码可通过res.status(301)覆盖默认的 302。这与你调用res.location(/foo/bar)后手动发送响应所能观察到的Location头行为一致。注意事项与最佳实践res.location()只设置响应头不发送响应、不结束请求处理务必在后续调用res.send()/res.end()/res.redirect()等方法完成响应与res.redirect()相同back形式依赖请求头Referer/Referrer在无法获取来源时会回退到/因此依赖back时应考虑到来源缺失的兜底行为对只想告知客户端目标位置但不希望浏览器自动跳转的场景例如返回 JSON 的同时附带资源地址、或需要自定义状态码与响应体优先使用res.location()而非res.redirect()不要自定义名为location的响应lib/hooks/responses/index.js 将其列为保留键以免覆盖 Express 原生方法关于 Sailsres对象的整体能力与协议支持范围可参考 docs/reference/res/res.md其他内置响应方法如res.badRequest()、res.serverError()、res.view()的说明位于 docs/reference/res/ 目录下。赞分享后端【免费下载链接】sailsRealtime MVC Framework for Node.js项目地址https://gitcode.com/gh_mirrors/sa/sails点击查看免费下载相关推荐Sails 响应头设置指南深入解析 res.set()Sails 响应头设置指南深入解析 res.set 导读 res.set 是 Sails 应用中设置 HTTP 响应头Response Header的核心后端Sails 框架 res.get() 方法详解读取响应头Response Header的完整指南Sails 框架 res.get 方法详解读取响应头Response Header的完整指南 在 Sails 的请求 响应生命周期中 res 响应对象是后端Sails 框架 res.clearCookie() 方法完全指南清除响应 Cookie 的正确姿势Sails 框架 res.clearCookie 方法完全指南清除响应 Cookie 的正确姿势 res.clearCookie 是 SailsNode.j后端上一篇JUnit4 Rule事件监听终极指南掌握6大核心事件类型与实战技巧下一篇Mall-Cook移动端适配终极指南打造完美移动购物体验的10个技术要点创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
