ARTICLE DETAIL

资讯详情

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

Sails 中 res.type() 使用指南:Content-Type 响应头的宽容解析与实战

Sails 中 res.type() 使用指南:Content-Type 响应头的宽容解析与实战 Sails 中 res.type() 使用指南Content-Type 响应头的宽容解析与实战【免费下载链接】sailsRealtime MVC Framework for Node.js项目地址: https://gitcode.com/gh_mirrors/sa/sailsres.type()是 Sails 应用基于 Express 构建中用于设置 HTTP 响应头Content-Type的便捷方法。它最大的特点是“宽容”既能接受html、json、png这类文件扩展名也能直接接受application/json这类完整 MIME 类型。读完本文你将掌握res.type()的解析规则、在 Sails action 中的标准写法以及它与res.send()、res.json()在 Content-Type 处理上的协作关系。一、res.type()是什么res.type(type)的作用是将响应的Content-Type响应头设置为指定的type值。它是 Sails 响应对象res众多方法中的一员Sails 建立在 Express 之上并遵循 Node 原生 HTTP 服务器的约定因此在 action、helper 和 policy 中拿到的res对象可以直接使用 Node 与 Express 的全部方法与属性详见 docs/reference/res/res.md。语法res.type(type);基本示例res.type(.html); res.type(html); res.type(json); res.type(application/json); res.type(png);二、宽容的解析规则文档原文特别强调这个方法“相当宽容”pretty forgiving。其核心解析逻辑可以归纳为两条如果type中包含/则假定它本身就是一个 MIME 类型并“原样”解释interprets it literally。例如res.type(application/json)会把Content-Type直接设置为application/json不做任何转换。如果type中不包含/则把它当作文件扩展名来处理交由底层 MIME 类型表解析为对应的 Content-Type。例如html、json、png都会被解析成各自的媒体类型.html这种带点前缀的写法同样被接受因为方法内部对扩展名解析是宽容的点号会被容忍。这种设计让开发者不必记忆完整的 MIME 字符串写res.type(png)即可同时当需要精确控制例如自定义媒体类型application/vnd.apijson这类含/的值时又能原样透传。三、在 Sails action 中的实战用法res.type()最常见的用途是在发送响应体之前先声明响应的媒体类型。下面是一个完整的 Sails action 示例// api/controllers/user/fetch-profile.js module.exports { friendlyName: Fetch profile, description: 返回用户资料的纯文本描述, fn: async function (req, res) { // 先声明 Content-Type再发送文本响应体 res.type(html); res.send(h1Hello from Sails!/h1); } };同理如果希望返回带特定媒体类型的 JSON例如 REST API 中常见的application/vnd.apijson可以这样写res.type(application/vnd.apijson); // 含 /原样设置 res.status(200).send({ data: { id: 7, type: users } });搭配其他res方法使用res.type()与res.set()一样都属于“设置响应头”的范畴常与res.status()、res.send()、res.json()串联使用res.status(201).type(json).send({ ok: true });注意res.type()返回的是响应对象本身支持链式调用因此它既可以写在发送方法之前也可以按上面的方式链式拼接。四、与res.send()/res.json()的 Content-Type 协作理解res.type()的价值最好同时了解 Sails 在未显式设置 Content-Type 时的自动行为。在 Sails 的响应对象构建器中lib/router/res.jsres.send()对 Content-Type 的处理是发送 JS 对象非字符串时如果响应头中还没有content-type会自动设置为application/json如果开发者已经手动设置了content-type则不会覆盖见 lib/router/res.js发送字符串时不会自动设置 Content-Type保持开发者设定的值或不设置发送 HTML 时res.redirect()、res.render()等面向页面的方法会显式设置text/html见 lib/router/res.js。仓库自带的测试用例印证了这些行为test/unit/res.test.jsit(should set a content-type when we send a JS object but dont set content-type, function () { var res buildRes(); var resBodyData {foo: bar}; res.status(200).send(resBodyData); res.headers[content-type].should.equal(application/json); }); it(should not overwrite our content-type header when we send a JS object, function () { var res buildRes(); var ourCustomMime application/vnd.sails.test.v1json; res.set(content-type, ourCustomMime); // 手动设置 Content-Type res.status(200).send(resBodyData); res.headers[content-type].should.equal(ourCustomMime); // 不会被覆盖 });由此可以得到一个实战结论如果你需要自定义的 Content-Type尤其是字符串响应体应当显式调用res.type()或res.set(content-type, ...)因为字符串响应体默认不会自动设置媒体类型。五、实现层面res.type()来自哪里在 Sails 的响应对象构建器 lib/router/res.js 中Sails 提供了res.set()lib/router/res.js与res.get()lib/router/res.js等基础头部操作方法而res.type()本身是Express 提供的标准方法随express依赖当前仓库 package.json 中锁定为express4.22.2见 package.json注入到响应对象上。从源码结构看Sails 对res的处理思路是构建一个具备传输无关transport-agnostic能力的响应对象将 Node/Express 的标准能力完整保留再叠加res.ok()、res.serverError()、res.view()等 Sails 自定义便捷方法。因此res.type()的解析细节扩展名 → MIME 的查找映射由 Express 底层的 mime 解析逻辑负责Sails 层不做二次包装行为与 Express 保持一致。六、使用注意事项在响应发送之前调用res.type()只负责写Content-Type头必须在res.send()/res.end()等发送动作之前调用才有效响应一旦发出HTTP 或 socket 传输后续修改无效。显式设置不会被自动逻辑覆盖如前文测试所示Sails 的res.send()在检测到已有content-type时不会覆盖它因此res.type()设置的媒体类型可以稳定生效。含/时原样透传想使用完整 MIME 字符串含/时值会被原样采用这同样适用于vnd.*、application/*等自定义媒体类型。大小写与字符集Content-Type头的值与具体传递的字符串有关如需声明字符集如text/html; charsetutf-8可在 MIME 值中一并书写或在发送时依赖res.send()默认设置的utf-8字符集见 lib/router/res.js 中res.charset res.charset || utf-8。WebSocket 传输的局限在 Sails 的协议支持矩阵中见 docs/reference/res/res.mdres.type()标记为HTTP 全支持、WebSocket 下未实现:white_large_square:。因此在面向 Socket 客户端的实时响应场景中不建议依赖res.type()声明媒体类型。相关参考res.type() API 参考文档响应对象res总览响应对象构建器源码res.set/res.get/res.send实现响应头自动设置行为测试用例Express 依赖声明package.json【免费下载链接】sailsRealtime MVC Framework for Node.js项目地址: https://gitcode.com/gh_mirrors/sa/sails创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表