0

0

Node.js中如何操作HTTP头?

小老鼠

小老鼠

发布时间:2025-08-29 18:53:01

|

863人浏览过

|

来源于php中文网

原创

Node.js通过http/https模块操作HTTP头,使用request.headers读取请求头,response.setHeader或res.writeHead设置响应头,注意在发送响应前完成头设置,避免错误;可通过中间件统一处理头信息,如CORS、认证等,结合cookie模块处理Cookie,利用Accept头实现内容协商,确保头字段格式正确、值合法,提升应用安全性与兼容性。

node.js中如何操作http头?

在Node.js中,你可以通过

http
https
模块来操作HTTP头,无论是设置请求头还是响应头,都相当直接。核心在于理解
request
response
对象,它们分别代表客户端请求和服务器响应。

解决方案

在Node.js中,操作HTTP头主要涉及两个方面:处理客户端请求的头信息以及设置服务器响应的头信息。

处理客户端请求头信息

当Node.js服务器接收到客户端的请求时,请求头信息会包含在

request
对象中。你可以通过
request.headers
属性访问这些头信息,它是一个JavaScript对象,包含了所有请求头字段和对应的值。

const http = require('http');

const server = http.createServer((req, res) => {
  console.log('请求头:', req.headers); // 打印所有请求头

  const userAgent = req.headers['user-agent']; // 获取User-Agent
  console.log('User-Agent:', userAgent);

  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello, World!');
});

server.listen(3000, () => {
  console.log('Server running on port 3000');
});

这段代码演示了如何访问和打印请求头,以及如何获取特定的请求头字段(例如

User-Agent
)。

设置服务器响应头信息

在服务器端,你需要使用

response
对象来设置响应头。有两种主要的方式:
res.setHeader()
res.writeHead()

  • res.setHeader(name, value)
    : 用于设置单个响应头。可以多次调用来设置多个头。

  • res.writeHead(statusCode, [reasonPhrase], [headers])
    : 用于设置HTTP状态码和响应头。通常在发送响应体之前调用。

const http = require('http');

const server = http.createServer((req, res) => {
  res.setHeader('Content-Type', 'application/json');
  res.setHeader('X-Custom-Header', 'My Custom Value');

  const responseData = { message: 'Hello, World!' };
  res.writeHead(200);
  res.end(JSON.stringify(responseData));
});

server.listen(3000, () => {
  console.log('Server running on port 3000');
});

在这个例子中,我们使用

res.setHeader()
设置了
Content-Type
和自定义的
X-Custom-Header
。然后,使用
res.writeHead()
设置了状态码200。注意,
res.writeHead()
也可以接受一个包含头信息的对象作为第三个参数,这允许你一次性设置多个头。

一些需要注意的点

  • 大小写不敏感: HTTP头字段名是不区分大小写的,但通常建议使用首字母大写的形式,例如
    Content-Type
  • 重复的头: 如果多次设置同一个头,行为取决于具体的头。有些头会覆盖之前的值,有些头会合并多个值。
  • 顺序: 头发送的顺序很重要,特别是对于一些特殊的头,例如
    Content-Length
  • 状态码: 确保设置正确的HTTP状态码,这对于客户端正确处理响应至关重要。

如何处理Node.js中常见的HTTP头相关错误?

处理HTTP头时,一些常见的错误包括:尝试在发送响应体后修改头、设置了无效的头值、或者头信息格式不正确。

  • 在发送响应体后修改头: 一旦你调用了

    res.end()
    res.write()
    发送了响应体,就不能再修改头了。Node.js会抛出一个错误。

    const http = require('http');
    
    const server = http.createServer((req, res) => {
      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.end('Hello, World!');
    
      // 尝试在res.end()之后设置头,会报错
      // res.setHeader('X-Custom-Header', 'My Custom Value'); // 错误:Cannot set headers after they are sent to the client
    });
    
    server.listen(3000, () => {
      console.log('Server running on port 3000');
    });

    解决方法是在发送响应体之前设置所有需要的头。

  • 设置无效的头值: 某些头有特定的值格式要求。例如,

    Content-Length
    必须是一个整数。如果设置了无效的值,可能会导致客户端无法正确解析响应。

    res.setHeader('Content-Length', 'abc'); // 错误:Content-Length必须是整数

    确保按照HTTP规范设置正确的头值。

  • 头信息格式不正确: 头字段名和值之间应该用冒号分隔,并且遵循HTTP协议的格式要求。不正确的格式可能导致客户端无法解析头信息。

    res.setHeader('Content-Type: text/plain'); // 错误:格式不正确

    正确的写法是

    res.setHeader('Content-Type', 'text/plain');

  • CORS错误: 跨域资源共享(CORS)错误是常见的HTTP头相关问题。当客户端从一个域请求另一个域的资源时,浏览器会进行CORS检查。服务器需要设置适当的

    Access-Control-Allow-Origin
    头来允许跨域请求。

    res.setHeader('Access-Control-Allow-Origin', '*'); // 允许所有域

    更安全的做法是只允许特定的域:

    res.setHeader('Access-Control-Allow-Origin', 'https://example.com'); // 只允许example.com

如何使用Node.js处理Cookie?

Cookie是存储在客户端浏览器中的小型文本文件,用于在客户端和服务器之间传递状态信息。Node.js提供了多种方式来处理Cookie,包括读取请求中的Cookie和设置响应中的Cookie。

读取请求中的Cookie

请求中的Cookie信息包含在

request.headers.cookie
字段中。这个字段是一个字符串,包含了所有Cookie的键值对,用分号和空格分隔。你需要解析这个字符串来获取单个Cookie的值。

const http = require('http');
const cookie = require('cookie');

const server = http.createServer((req, res) => {
  const cookies = cookie.parse(req.headers.cookie || '');

  console.log('Cookies:', cookies);

  const myCookie = cookies.myCookie; // 获取名为myCookie的Cookie
  console.log('myCookie:', myCookie);

  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello, World!');
});

server.listen(3000, () => {
  console.log('Server running on port 3000');
});

在这个例子中,我们使用了

cookie
模块(需要通过
npm install cookie
安装)来解析
request.headers.cookie
字符串。
cookie.parse()
函数将Cookie字符串转换为一个JavaScript对象,方便我们访问单个Cookie的值。

设置响应中的Cookie

要设置响应中的Cookie,你需要使用

Set-Cookie
头。你可以使用
res.setHeader()
来设置这个头。

iMuse.AI
iMuse.AI

iMuse.AI 创意助理,为设计师提供无限灵感!

下载
const http = require('http');

const server = http.createServer((req, res) => {
  res.setHeader('Set-Cookie', 'myCookie=myValue; Path=/; HttpOnly'); // 设置Cookie

  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello, World!');
});

server.listen(3000, () => {
  console.log('Server running on port 3000');
});

在这个例子中,我们设置了一个名为

myCookie
的Cookie,值为
myValue
Path=/
表示这个Cookie对整个域名有效。
HttpOnly
表示这个Cookie只能通过HTTP访问,不能通过JavaScript访问,这有助于防止XSS攻击。

Cookie选项

Set-Cookie
头支持多个选项,用于控制Cookie的行为:

  • Path
    : 指定Cookie的有效路径。
  • Domain
    : 指定Cookie的有效域名。
  • Expires
    : 指定Cookie的过期时间。
  • Max-Age
    : 指定Cookie的有效期(秒)。
  • Secure
    : 指定Cookie只能通过HTTPS连接发送。
  • HttpOnly
    : 指定Cookie只能通过HTTP访问。
  • SameSite
    : 指定Cookie的跨站行为(
    Strict
    ,
    Lax
    ,
    None
    )。

你可以通过在

Set-Cookie
头中添加这些选项来更精细地控制Cookie的行为。例如:

res.setHeader('Set-Cookie', [
  'myCookie=myValue; Path=/; HttpOnly',
  'anotherCookie=anotherValue; Domain=example.com; Max-Age=3600'
]);

这段代码设置了两个Cookie,一个设置了

HttpOnly
选项,另一个设置了
Domain
Max-Age
选项。

如何在Node.js中使用HTTP头进行内容协商?

内容协商是一种机制,允许客户端和服务器就响应的最佳表示形式达成一致。客户端通过

Accept
Accept-Language
Accept-Encoding
等请求头来表达其偏好,服务器根据这些偏好选择最合适的响应内容。

处理

Accept

Accept
头指定客户端可以接受的内容类型。服务器可以解析这个头,并根据客户端的偏好返回不同类型的响应。

const http = require('http');

const server = http.createServer((req, res) => {
  const accept = req.headers['accept'];

  if (accept.includes('application/json')) {
    res.setHeader('Content-Type', 'application/json');
    const responseData = { message: 'Hello, World!' };
    res.end(JSON.stringify(responseData));
  } else if (accept.includes('text/html')) {
    res.setHeader('Content-Type', 'text/html');
    res.end('<h1>Hello, World!</h1>');
  } else {
    res.setHeader('Content-Type', 'text/plain');
    res.end('Hello, World!');
  }
});

server.listen(3000, () => {
  console.log('Server running on port 3000');
});

在这个例子中,服务器根据

Accept
头的值返回不同类型的响应。如果客户端接受
application/json
,则返回JSON格式的响应;如果客户端接受
text/html
,则返回HTML格式的响应;否则,返回纯文本格式的响应。

处理

Accept-Language

Accept-Language
头指定客户端可以接受的语言。服务器可以解析这个头,并根据客户端的偏好返回不同语言的响应。

const http = require('http');

const server = http.createServer((req, res) => {
  const acceptLanguage = req.headers['accept-language'];

  let message = 'Hello, World!';

  if (acceptLanguage.includes('zh')) {
    message = '你好,世界!';
  } else if (acceptLanguage.includes('fr')) {
    message = 'Bonjour, le monde!';
  }

  res.setHeader('Content-Type', 'text/plain; charset=utf-8');
  res.end(message);
});

server.listen(3000, () => {
  console.log('Server running on port 3000');
});

在这个例子中,服务器根据

Accept-Language
头的值返回不同语言的问候语。

处理

Accept-Encoding

Accept-Encoding
头指定客户端可以接受的编码方式(例如gzip、deflate)。服务器可以根据这个头选择合适的编码方式来压缩响应,从而减少传输大小。

const http = require('http');
const zlib = require('zlib');

const server = http.createServer((req, res) => {
  const acceptEncoding = req.headers['accept-encoding'];

  let raw = 'Hello, World!'.repeat(1000); // 创建一个较大的字符串

  if (acceptEncoding && acceptEncoding.includes('gzip')) {
    zlib.gzip(raw, (err, compressed) => {
      if (err) {
        console.error(err);
        res.writeHead(500);
        res.end('Error compressing response');
        return;
      }
      res.setHeader('Content-Encoding', 'gzip');
      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.end(compressed);
    });
  } else {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end(raw);
  }
});

server.listen(3000, () => {
  console.log('Server running on port 3000');
});

在这个例子中,服务器首先检查

Accept-Encoding
头是否包含
gzip
。如果包含,则使用
zlib.gzip()
函数压缩响应,并设置
Content-Encoding
头为
gzip
。否则,直接返回未压缩的响应。

使用第三方库

一些第三方库可以简化内容协商的处理,例如

negotiator
。这些库可以解析
Accept
Accept-Language
Accept-Encoding
等头,并根据客户端的偏好选择最佳的响应。

如何使用中间件来处理HTTP头?

中间件是在请求到达最终路由处理程序之前执行的函数。它们可以用于处理各种任务,包括修改请求或响应头。在Express.js等框架中,中间件是处理HTTP头的常用方法。

const express = require('express');
const app = express();

// 中间件示例:设置全局的X-Powered-By头
app.use((req, res, next) => {
  res.setHeader('X-Powered-By', 'Node.js');
  next(); // 调用next()传递控制权给下一个中间件或路由处理程序
});

// 中间件示例:处理CORS
app.use((req, res, next) => {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
  next();
});

// 路由处理程序
app.get('/', (req, res) => {
  res.send('Hello, World!');
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

在这个例子中,我们定义了两个中间件。第一个中间件设置了全局的

X-Powered-By
头,用于标识服务器使用的技术。第二个中间件处理了CORS,允许来自任何域的跨域请求。

使用中间件处理请求头

中间件也可以用于处理请求头。例如,你可以创建一个中间件来检查请求头中是否包含特定的认证信息。

const express = require('express');
const app = express();

// 中间件示例:检查认证信息
app.use((req, res, next) => {
  const authHeader = req.headers['authorization'];

  if (!authHeader) {
    return res.status(401).send('Unauthorized');
  }

  // 在这里验证authHeader的值
  // 例如,检查是否与预期的令牌匹配

  next();
});

// 路由处理程序
app.get('/protected', (req, res) => {
  res.send('Protected Resource');
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

在这个例子中,中间件检查请求头中是否包含

Authorization
头。如果不包含,则返回401 Unauthorized错误。如果包含,则可以进一步验证
Authorization
头的值,例如检查是否与预期的令牌匹配。

使用

express.json()
express.urlencoded()
中间件

express.json()
express.urlencoded()
是Express.js内置的中间件,用于解析请求体中的JSON和URL编码的数据。它们会自动设置
Content-Type
头为
application/json
application/x-www-form-urlencoded

const express = require('express');
const app = express();

app.use(express.json()); // 解析JSON请求体
app.use(express.urlencoded({ extended: true })); // 解析URL编码的请求体

app.post('/data', (req, res) => {
  console.log('请求体:', req.body);
  res.send('Data received');
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

在这个例子中,

express.json()
express.urlencoded()
中间件会自动解析请求体中的数据,并将解析后的数据存储在
req.body
对象中。

总而言之,Node.js中操作HTTP头是一个直接但多面的任务,涉及到请求和响应的处理。理解HTTP头的工作原理,以及如何正确地设置和处理它们,对于构建健壮和安全的Web应用程序至关重要。使用中间件可以更方便地处理HTTP头,并提高代码的可维护性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

184

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

226

2025.12.18

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

83

2025.09.10

Node.js后端开发与Express框架实践
Node.js后端开发与Express框架实践

本专题针对初中级 Node.js 开发者,系统讲解如何使用 Express 框架搭建高性能后端服务。内容包括路由设计、中间件开发、数据库集成、API 安全与异常处理,以及 RESTful API 的设计与优化。通过实际项目演示,帮助开发者快速掌握 Node.js 后端开发流程。

436

2026.02.10

cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6500

2023.06.30

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

90

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 13.5万人学习

【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2.1万人学习

Node.js-前端工程化必学
Node.js-前端工程化必学

共19课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号