资讯动态

Sails 框架 `res.get()` 方法详解:读取响应头(Response Header)的完整指南

发布时间:2026/9/20 17:33:02 来源:尧图企业网站定制
Sails 框架res.get()方法详解读取响应头Response Header的完整指南【免费下载链接】sailsRealtime MVC Framework for Node.js项目地址: https://gitcode.com/gh_mirrors/sa/sails在 Sails 的请求-响应生命周期中res响应对象是每个 action、policy 与自定义响应都能访问的核心对象。res.get()是其中最基础也最常用的方法之一——它用于读取当前响应对象上指定响应头的值是调试响应、做内容协商content negotiation、编写条件逻辑时的得力工具。读完本文你将掌握res.get()的完整语法、返回值语义、与res.set()的配合方式以及它在 Sails 源码与内置响应机制中的实际运作原理。方法签名与核心语义res.get()用于返回指定响应头header的当前值其用法签名如下res.get(header);其中header为字符串类型的响应头名称例如Content-Type、X-Powered-By或Location等。返回值该方法返回指定响应头在当前res对象上的值字符串。如果该响应头尚未被设置则返回undefined。这一点在 Sails 源码中体现得非常直接——lib/router/res.js 中res.get的实现为res.get function (headerName) { return res.headers res.headers[headerName]; };从源码结构看Sails 的res.get()本质上是直接对res.headers这个对象做键值查找找到则返回对应的头值找不到或headers尚不存在时返回undefined。基本示例官方文档给出了最典型的调用方式docs/reference/res/res.get.mdres.get(Content-Type); // - text/plain更贴近实际 action 的用法如下在发送响应之前读取并判断响应头的值// api/controllers/user/read.js 中的某个 action module.exports async function (req, res) { // 在设置响应头之前res.get() 返回 undefined console.log(res.get(Content-Type)); // - undefined // 设置响应头之后即可读到 res.set(Content-Type, text/plain); console.log(res.get(Content-Type)); // - text/plain return res.send(Hello!); };使用注意点官方文档在 Notes 部分明确了两条关键行为docs/reference/res/res.get.mdheader参数大小写不敏感case-insensitive。响应头在响应被发送response is sent之前都可以修改具体见res.set()。大小写不敏感的行为细节虽然 Sails 核心的res.get实现lib/router/res.js是直接按键名取值的但整个请求解释管线中的底层响应对象——mock-res组件lib/router/mock-res.js——在setHeader/getHeader时统一将头名转为小写存储与读取MockServerResponse.prototype.setHeader function(name, value) { this._headers[name.toLowerCase()] value; }; MockServerResponse.prototype.getHeader function(name) { return this._headers[name.toLowerCase()]; };因此在 Sails 应用中res.get(content-type)与res.get(Content-Type)可以得到一致的结果这正是文档所述大小写不敏感的底层保障。从源码结构可以推断该行为与 Node.js HTTP 模块及 Express 的响应头处理惯例保持一致。响应发送前可变res.get()读取的是当前的响应头状态。Sails 内置的res.send()实现lib/router/res.js会在真正写出响应前把_headers合并进res.headers再调用writeHead()也就是说只要响应尚未结束res.end()未被调用你通过res.set()修改的头都能被res.get()及时读到。与res.set()的配套使用res.get()与res.set()是一对镜像方法res.set(headerName, value)用于写入响应头res.get(headerName)用于回读。Sails 源码中的res.set实现如下lib/router/res.jsres.set function (headerName, value) { res.headers res.headers || {}; res.headers[headerName] value; return this; };两者配合的典型场景是先判断、后设置例如只在某个头未设置时才写入默认值if (!res.get(X-Custom-Header)) { res.set(X-Custom-Header, default-value); }更常见的实战用途是内容协商——根据当前的Content-Type决定返回 JSON 还是视图module.exports async function (req, res) { // 若上游中间件已经设置了 JSON 类型则走 JSON 分支 if (res.get(Content-Type) application/json) { return res.json({ ok: true }); } return res.view(pages/homepage, { ok: true }); };Sails 内部的真实调用一个官方实现证据res.get()并非只存在于 API 表面Sails 框架自身在res.send()的实现中也直接调用了它。在 lib/router/res.js 中当发送非字符串数据时Sails 会先序列化 JSON并检查是否已设置content-typetry { toWrite JSON.stringify(data); if (!res.get(content-type)) { res.set(content-type, application/json); } } catch(e) { // ... }这段代码说明当开发者向res.send()传入对象时Sails 会默认将Content-Type设为application/json但前提是通过res.get(content-type)确认当前尚未设置该头——这正是res.get()读取当前值、避免重复覆盖这一语义在框架内部的直接应用。在自定义响应中的使用与注意事项Sails 允许开发者在api/responses/目录下定义自定义响应方法并挂载到res对象上。此时需要注意get是 Sails 保留的res方法键名之一。在 lib/hooks/responses/index.js 中框架显式列出了保留键var reservedResKeys [ view, status, set, get, cookie, clearCookie, redirect, location, charset, send, json, jsonp, type, format, attachment, sendfile, download, links, locals, render ];因此不要在api/responses/中定义名为get或set、status等的自定义响应否则会触发invalidCustomResponse致命错误覆盖 Sails 内置方法会导致响应对象行为异常。在自定义响应内部res.get()可用于保持与内置响应一致的头信息处理例如在serverError或notFound中基于当前头决定返回格式// api/responses/notFound.js module.exports async function notFound() { var req this.req; var res this.res; // 根据当前 Content-Type 决定响应形态 if (res.get(Content-Type) application/json) { return res.json({ error: Not Found }); } return res.view(404); };传输协议支持说明Sails 构建在 Express 之上并实现了传输无关的请求解释器transport-agnostic request interpreter。关于res.get()的协议支持docs/reference/res/res.md 中说明了 Sails 中可访问 Node 与 Express 的res方法而在该文档的协议支持表中docs/reference/res/res.mdres.get()与res.set()一样被标记为HTTP 传输下完整支持。这意味着res.get()属于面向 HTTP 响应头的操作主要应用在常规 HTTP 请求-响应链路中包括虚拟请求解释器模拟的 HTTP 请求。在编写跨 WebSocket 与 HTTP 共用的通用逻辑时应留意这一传输差异——响应头读取本质上是一个 HTTP 层面的概念。常见问题小结读取不存在的头返回什么返回undefined不会抛出异常因此可直接用于if (res.get(...))判空。大小写是否敏感不敏感res.get(content-type)与res.get(Content-Type)等价。什么时候读不到刚设置的头只要在res.end()之前调用都能读到最新值响应发送完成后res.get()对已发出的响应不再有意义。能用它读请求头吗不能。res.get()只读取响应头读取请求头请使用req.get()Sails 中对应req.headers。相关参考方法文档docs/reference/res/res.get.md配套方法res.set()、req.get()响应对象总览docs/reference/res/res.md核心实现lib/router/res.jsres.set/res.get定义、lib/router/mock-res.js底层头存储框架内部调用示例lib/router/res.jsres.send()中的res.get(content-type)保留键约束lib/hooks/responses/index.js【免费下载链接】sailsRealtime MVC Framework for Node.js项目地址: https://gitcode.com/gh_mirrors/sa/sails创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价