Node.js中如何操作HTTP头?

来源:IPIPP.com作者:头衔:全栈工程师
导读:本期聚焦于小伙伴创作的《Node.js中如何操作HTTP头?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Node.js中如何操作HTTP头?》有用,将其分享出去将是对创作者最好的鼓励。

在Node.js的网络编程场景中,HTTP头的操作是非常基础且重要的环节,无论是搭建HTTP服务还是发起HTTP请求,都需要和HTTP头打交道。下面我们先通过一张图片直观了解HTTP头的基本结构,再展开具体的操作方法。

Node.js中如何操作HTTP头?

一、HTTP头的基础概念

HTTP头是HTTP请求和响应中携带的元数据,用来描述报文的相关属性。请求头由客户端发送给服务端,包含客户端的请求信息;响应头由服务端返回给客户端,包含服务端的响应配置。常见的HTTP头比如Content-Type用来指定内容类型,Cache-Control用来设置缓存策略,Authorization用来传递认证信息。

二、Node.js服务端操作HTTP头

Node.js内置的http模块创建的服务端,可以通过响应对象res来操作响应头,也可以通过请求对象req获取请求头信息。

1. 设置响应头

设置响应头有两种常用方式,分别是setHeader方法和直接在writeHead中传入头信息。

使用setHeader方法设置单个响应头:

const http = require('http');

const server = http.createServer((req, res) => {
  // 设置内容类型为JSON
  res.setHeader('Content-Type', 'application/json; charset=utf-8');
  // 设置允许跨域
  res.setHeader('Access-Control-Allow-Origin', '*');
  // 设置缓存时间为1小时
  res.setHeader('Cache-Control', 'max-age=3600');
  res.end(JSON.stringify({ code: 0, msg: '请求成功' }));
});

server.listen(3000, () => {
  console.log('服务运行在3000端口');
});

使用writeHead一次性设置状态码和多个响应头:

const http = require('http');

const server = http.createServer((req, res) => {
  // 第一个参数是状态码,第二个参数是响应头对象
  res.writeHead(200, {
    'Content-Type': 'text/html; charset=utf-8',
    'X-Powered-By': 'Node.js'
  });
  res.end('<h1>Hello Node.js</h1>');
});

server.listen(3000, () => {
  console.log('服务运行在3000端口');
});

2. 获取响应头

可以通过getHeader方法获取已经设置的响应头,如果头不存在则返回undefined:

const http = require('http');

const server = http.createServer((req, res) => {
  res.setHeader('Content-Type', 'application/json');
  // 获取Content-Type头
  const contentType = res.getHeader('Content-Type');
  console.log('当前Content-Type:', contentType); // 输出 application/json
  res.end(JSON.stringify({ test: 1 }));
});

server.listen(3000, () => {
  console.log('服务运行在3000端口');
});

3. 移除响应头

使用removeHeader方法可以移除已经设置的响应头:

const http = require('http');

const server = http.createServer((req, res) => {
  res.setHeader('X-Test', 'test-value');
  // 移除X-Test头
  res.removeHeader('X-Test');
  // 此时获取X-Test头会返回undefined
  console.log(res.getHeader('X-Test')); // 输出 undefined
  res.end('响应结束');
});

server.listen(3000, () => {
  console.log('服务运行在3000端口');
});

4. 获取请求头

服务端的请求对象reqheaders属性是一个对象,包含了所有客户端发来的请求头:

const http = require('http');

const server = http.createServer((req, res) => {
  // 获取所有请求头
  const allHeaders = req.headers;
  console.log('所有请求头:', allHeaders);
  // 获取指定请求头,比如user-agent
  const userAgent = req.headers['user-agent'];
  console.log('User-Agent:', userAgent);
  res.end('请求头获取完成');
});

server.listen(3000, () => {
  console.log('服务运行在3000端口');
});

三、Node.js客户端操作HTTP头

使用http模块的request方法发起客户端请求时,可以在请求配置中设置请求头,也可以通过响应对象获取服务端返回的响应头。

1. 设置请求头发起请求

const http = require('http');

// 请求配置
const options = {
  hostname: 'ipipp.com',
  port: 80,
  path: '/api/test',
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer test_token_123'
  }
};

const req = http.request(options, (res) => {
  let data = '';
  res.on('data', (chunk) => {
    data += chunk;
  });
  res.on('end', () => {
    console.log('响应结果:', data);
  });
});

req.on('error', (err) => {
  console.error('请求错误:', err);
});

// 发送请求体
req.write(JSON.stringify({ name: 'test' }));
req.end();

2. 获取响应头

客户端请求的响应对象resheaders属性包含了服务端返回的所有响应头:

const http = require('http');

const options = {
  hostname: 'ipipp.com',
  port: 80,
  path: '/',
  method: 'GET'
};

const req = http.request(options, (res) => {
  // 获取所有响应头
  console.log('响应头:', res.headers);
  // 获取指定响应头,比如content-type
  console.log('Content-Type:', res.headers['content-type']);
});

req.end();

四、操作HTTP头的注意事项

  • 响应头必须在响应体发送之前设置,一旦调用了res.write或者res.end发送了响应体,再设置响应头会无效。
  • 请求头的键名不区分大小写,但是建议使用小写形式,Node.js内部会自动处理大小写转换。
  • 如果要设置多个同名的请求头,可以将值设置为数组,比如'Set-Cookie': ['a=1', 'b=2']
  • 部分HTTP头是只读的,比如Content-Length如果由Node.js自动计算,手动设置可能会被覆盖。
实际开发中,如果是使用Express、Koa等框架,操作HTTP头的方法会和原生http模块略有不同,但底层原理一致,框架通常会提供更便捷的封装方法。

掌握Node.js中HTTP头的操作方法,能够帮助开发者更好地处理网络请求和响应,解决实际开发中的跨域、缓存、认证等常见问题。

Node.jsHTTP头http模块setHeadergetHeader修改时间:2026-06-02 05:00:36

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。