掌握 HTTP 内容协商:Node.js 中的 Accepts 模块详解

HTTP 内容协商机制使服务能够根据客户端的请求头(如 Accept, Accept-Language, Accept-Encoding)返回最合适的响应。在 Node.js 生态中,accepts 模块基于强大的 negotiator 库简化了内容协商的流程。本文将深入解析 accepts 的安装、API 使用,并通过代码示例展示如何在实际项目中应用此模块。

📦 安装

使用 npm 安装 accepts 模块:

bash 复制代码
$ npm install accepts

在你的项目中引入 accepts:

javascript 复制代码
var accepts = require('accepts');

🚀 基本使用

创建一个 Accepts 对象来处理传入的 req 对象(HTTP 请求)。

javascript 复制代码
var accept = accepts(req);

字符集协商

检查请求所接受的字符集,并选择最优选项:

javascript 复制代码
// 返回第一个客户端接受的字符集
var charset = accept.charset(['utf-8', 'iso-8859-1']);

if (charset) {
  console.log('客户端接受的字符集为:', charset);
} else {
  console.log('客户端不接受提供的字符集');
}

编码格式协商

确定客户端接受的编码格式:

javascript 复制代码
// 返回第一个客户端接受的编码格式
var encoding = accept.encoding(['gzip', 'deflate']);

if (encoding) {
  console.log('客户端接受的编码格式为:', encoding);
} else {
  console.log('客户端不接受提供的编码格式');
}

语言协商

选择客户端优先接受的语言:

javascript 复制代码
// 返回第一个客户端接受的语言
var language = accept.language(['en', 'es', 'fr']);

if (language) {
  console.log('客户端接受的语言为:', language);
} else {
  console.log('客户端不接受提供的语言选项');
}

类型协商

基于客户端请求头的 Accept 条目选择最适合的响应类型:

javascript 复制代码
// 返回第一个客户端接受的类型
var type = accept.type(['json', 'html']);

if (type) {
  console.log('客户端接受的类型为:', type);
} else {
  console.log('客户端不接受提供的类型选项');
}

🌐 举例

假设你的服务器需要根据客户端请求返回不同类型的数据格式,例如 JSON 或 HTML。

javascript 复制代码
var accepts = require('accepts');
var http = require('http');

function handleRequest(req, res) {
  var accept = accepts(req);

  // 你的服务器类型优先级列表
  switch (accept.type(['json', 'html'])) {
    case 'json':
      res.setHeader('Content-Type', 'application/json');
      res.write('{"message":"Hello, world!"}');
      break;
    case 'html':
      res.setHeader('Content-Type', 'text/html');
      res.write('**Hello, world!**');
      break;
    default:
      res.setHeader('Content-Type', 'text/plain');
      res.write('Hello, world!');
      break;
  }

  res.end();
}

http.createServer(handleRequest).listen(3000);

使用 cURL 测试服务器响应:

bash 复制代码
curl -H 'Accept: text/html' http://localhost:3000/

该请求会从服务器接收到 HTML 格式的相应,因为客户端通过 Accept 请求头明确表示了首选类型。

仓库地址:github.com/jshttp/acce...

通过本文,你已经学会了如何使用 accepts 模块提高你的 Node.js 服务的内容协商能力,支持更复杂的协商逻辑以便返回最适合客户端的响应。

相关推荐
Flynt6 小时前
axios 被投毒半年后,我把 npm 的"安全防线"实测了一遍:最信任的 SHA512 是安慰剂
前端·npm·node.js
T_Wizard12 小时前
Windows 下 NVM 踩坑实录:命令找不到、下载超时、C盘爆满、环境冲突一次搞定
node.js
第404号工位13 小时前
40块钱二手瘦客户端,如何跑满家庭物联网中枢?(拒绝Docker爆盘实录)
linux·架构·node.js
天若有情67318 小时前
POT规范|一套个人自研NPM包本地生命周期管理体系
npm·包管理·前端工程化·个人开源·工程规范·pot规范
定栓1 天前
Webpack迁到Vite第七节(二):全家桶移除 — Babel 全家桶深度分析
前端·webpack·node.js
wx47661 天前
用代码做视频:我把一个 HTML 页面变成了可复现的 MP4
node.js
doujiaozh1 天前
协议演进实录:从明文哈希到 AES-GCM 加密,如何平滑升级?
后端·node.js
定栓1 天前
Webpack迁到Vite第七节(一):全家桶移除 — 配置文件与构建核心
前端·webpack·node.js
定栓2 天前
Webpack迁到Vite第七节(四):全家桶移除 — 保留项、脚本与数据收尾
前端·webpack·node.js
定栓2 天前
Webpack迁到Vite第五节:第三方库兼容
前端·webpack·node.js