Search K
Appearance
Appearance
📊 SEO元描述:2024年最新Node.js HTTP模块教程,详解HTTP服务器创建、请求响应处理、状态码设置。包含完整代码示例,适合后端开发者快速掌握HTTP服务器开发。
核心关键词:Node.js HTTP模块2024、HTTP服务器创建、Node.js后端开发、HTTP请求响应、Node.js Web服务器
长尾关键词:Node.js怎么创建HTTP服务器、HTTP模块是什么、Node.js HTTP状态码设置、HTTP服务器开发教程、Node.js Web开发入门
通过本节Node.js HTTP模块基础教程,你将系统性掌握:
HTTP模块是什么?这是Node.js初学者最常问的问题。HTTP模块是Node.js内置的核心模块,用于创建HTTP服务器和客户端,也是Web应用开发的重要基础。
💡 学习建议:HTTP模块是Node.js Web开发的基础,建议先掌握基本用法再学习Express等框架
让我们从最简单的HTTP服务器开始,理解HTTP模块的基本用法:
// 🎉 创建基础HTTP服务器
const http = require('http');
// 创建HTTP服务器
const server = http.createServer((req, res) => {
// 设置响应头
res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
// 发送响应内容
res.end('Hello World! 这是我的第一个Node.js HTTP服务器');
});
// 监听端口
const PORT = 3000;
server.listen(PORT, () => {
console.log(`服务器运行在 http://localhost:${PORT}`);
});// 🔍 请求对象属性详解
const http = require('http');
const url = require('url');
const server = http.createServer((req, res) => {
// 解析URL
const parsedUrl = url.parse(req.url, true);
console.log('=== 请求信息详解 ===');
console.log('请求方法:', req.method);
console.log('请求URL:', req.url);
console.log('请求路径:', parsedUrl.pathname);
console.log('查询参数:', parsedUrl.query);
console.log('请求头:', req.headers);
console.log('HTTP版本:', req.httpVersion);
console.log('客户端IP:', req.connection.remoteAddress);
// 响应请求信息
res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
res.end(JSON.stringify({
method: req.method,
url: req.url,
path: parsedUrl.pathname,
query: parsedUrl.query,
userAgent: req.headers['user-agent']
}, null, 2));
});
server.listen(3000, () => {
console.log('服务器启动:http://localhost:3000');
});请求对象核心属性:
💼 实用技巧:使用url.parse()可以方便地解析URL路径和查询参数
// 🚀 响应对象方法详解
const http = require('http');
const server = http.createServer((req, res) => {
const { method, url } = req;
// 设置响应头的不同方式
if (url === '/json') {
// 方式1:使用writeHead设置状态码和响应头
res.writeHead(200, {
'Content-Type': 'application/json; charset=utf-8',
'Access-Control-Allow-Origin': '*'
});
const data = {
message: '这是JSON响应',
timestamp: new Date().toISOString(),
method: method
};
res.end(JSON.stringify(data, null, 2));
} else if (url === '/html') {
// 方式2:使用setHeader单独设置响应头
res.setHeader('Content-Type', 'text/html; charset=utf-8');
res.statusCode = 200;
const html = `
<!DOCTYPE html>
<html>
<head>
<title>Node.js HTTP服务器</title>
<meta charset="utf-8">
</head>
<body>
<h1>欢迎使用Node.js HTTP服务器</h1>
<p>当前时间:${new Date().toLocaleString()}</p>
<p>请求方法:${method}</p>
</body>
</html>
`;
res.end(html);
} else if (url === '/redirect') {
// 重定向响应
res.writeHead(302, {
'Location': '/html'
});
res.end();
} else {
// 404错误响应
res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end('页面未找到 - 404 Not Found');
}
});
server.listen(3000, () => {
console.log('服务器启动:http://localhost:3000');
console.log('测试路径:');
console.log('- http://localhost:3000/json');
console.log('- http://localhost:3000/html');
console.log('- http://localhost:3000/redirect');
});// 🎯 处理不同HTTP方法
const http = require('http');
const url = require('url');
const server = http.createServer((req, res) => {
const { method } = req;
const parsedUrl = url.parse(req.url, true);
const path = parsedUrl.pathname;
// 设置CORS头,允许跨域请求
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
// 处理OPTIONS预检请求
if (method === 'OPTIONS') {
res.writeHead(200);
res.end();
return;
}
// 根据HTTP方法处理请求
switch (method) {
case 'GET':
handleGet(req, res, path, parsedUrl.query);
break;
case 'POST':
handlePost(req, res, path);
break;
case 'PUT':
handlePut(req, res, path);
break;
case 'DELETE':
handleDelete(req, res, path);
break;
default:
res.writeHead(405, { 'Content-Type': 'text/plain' });
res.end('Method Not Allowed');
}
});
// GET请求处理
function handleGet(req, res, path, query) {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
method: 'GET',
path: path,
query: query,
message: '成功处理GET请求'
}));
}
// POST请求处理
function handlePost(req, res, path) {
let body = '';
req.on('data', chunk => {
body += chunk.toString();
});
req.on('end', () => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
method: 'POST',
path: path,
body: body,
message: '成功处理POST请求'
}));
});
}
// PUT请求处理
function handlePut(req, res, path) {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
method: 'PUT',
path: path,
message: '成功处理PUT请求'
}));
}
// DELETE请求处理
function handleDelete(req, res, path) {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
method: 'DELETE',
path: path,
message: '成功处理DELETE请求'
}));
}
server.listen(3000, () => {
console.log('RESTful API服务器启动:http://localhost:3000');
});HTTP方法处理要点:
// 📊 HTTP状态码实战示例
const http = require('http');
const url = require('url');
const server = http.createServer((req, res) => {
const parsedUrl = url.parse(req.url, true);
const path = parsedUrl.pathname;
// 根据路径返回不同状态码
switch (path) {
case '/success':
// 200 - 成功
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
status: 200,
message: '请求成功',
data: { id: 1, name: 'Node.js' }
}));
break;
case '/created':
// 201 - 已创建
res.writeHead(201, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
status: 201,
message: '资源创建成功',
id: Date.now()
}));
break;
case '/redirect':
// 301 - 永久重定向
res.writeHead(301, { 'Location': '/success' });
res.end();
break;
case '/temp-redirect':
// 302 - 临时重定向
res.writeHead(302, { 'Location': '/success' });
res.end();
break;
case '/bad-request':
// 400 - 客户端错误
res.writeHead(400, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
status: 400,
error: 'Bad Request',
message: '请求参数错误'
}));
break;
case '/unauthorized':
// 401 - 未授权
res.writeHead(401, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
status: 401,
error: 'Unauthorized',
message: '需要身份验证'
}));
break;
case '/forbidden':
// 403 - 禁止访问
res.writeHead(403, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
status: 403,
error: 'Forbidden',
message: '没有访问权限'
}));
break;
case '/not-found':
// 404 - 未找到
res.writeHead(404, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
status: 404,
error: 'Not Found',
message: '请求的资源不存在'
}));
break;
case '/server-error':
// 500 - 服务器内部错误
res.writeHead(500, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
status: 500,
error: 'Internal Server Error',
message: '服务器内部错误'
}));
break;
default:
// 默认返回API列表
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.end(`
<h1>HTTP状态码测试API</h1>
<ul>
<li><a href="/success">200 - 成功</a></li>
<li><a href="/created">201 - 已创建</a></li>
<li><a href="/redirect">301 - 永久重定向</a></li>
<li><a href="/temp-redirect">302 - 临时重定向</a></li>
<li><a href="/bad-request">400 - 客户端错误</a></li>
<li><a href="/unauthorized">401 - 未授权</a></li>
<li><a href="/forbidden">403 - 禁止访问</a></li>
<li><a href="/not-found">404 - 未找到</a></li>
<li><a href="/server-error">500 - 服务器错误</a></li>
</ul>
`);
}
});
server.listen(3000, () => {
console.log('HTTP状态码测试服务器:http://localhost:3000');
});// 🔧 响应头设置最佳实践
const http = require('http');
const server = http.createServer((req, res) => {
// 安全相关响应头
const securityHeaders = {
'X-Content-Type-Options': 'nosniff',
'X-Frame-Options': 'DENY',
'X-XSS-Protection': '1; mode=block',
'Strict-Transport-Security': 'max-age=31536000; includeSubDomains'
};
// CORS相关响应头
const corsHeaders = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
'Access-Control-Max-Age': '86400'
};
// 缓存相关响应头
const cacheHeaders = {
'Cache-Control': 'public, max-age=3600',
'ETag': `"${Date.now()}"`,
'Last-Modified': new Date().toUTCString()
};
// 合并所有响应头
const allHeaders = {
'Content-Type': 'application/json; charset=utf-8',
...securityHeaders,
...corsHeaders,
...cacheHeaders
};
// 设置响应头
Object.entries(allHeaders).forEach(([key, value]) => {
res.setHeader(key, value);
});
// 响应数据
res.statusCode = 200;
res.end(JSON.stringify({
message: '响应头设置示例',
headers: allHeaders,
timestamp: new Date().toISOString()
}, null, 2));
});
server.listen(3000, () => {
console.log('响应头示例服务器:http://localhost:3000');
});响应头设置要点:
💡 安全提示:生产环境中应该设置适当的安全响应头,防止XSS、点击劫持等攻击
通过本节Node.js HTTP模块基础教程的学习,你已经掌握:
A: 学习原生HTTP模块有助于理解Web服务器的底层工作原理,这对于调试问题、性能优化和深入理解Express等框架非常重要。掌握基础后再学习框架会更加得心应手。
A: 开发环境通常使用3000、8000、8080等端口。生产环境HTTP使用80端口,HTTPS使用443端口。避免使用系统保留端口(0-1023),选择1024-65535范围内的端口。
A: Node.js基于事件循环和非阻塞I/O,天然支持高并发。单个HTTP服务器实例可以处理数千个并发连接。对于更高并发需求,可以使用cluster模块创建多进程。
A: 响应头必须在调用res.write()或res.end()之前设置。一旦开始发送响应体,就不能再修改响应头。建议在处理请求的开始就设置好所有必要的响应头。
A: 监听SIGTERM和SIGINT信号,调用server.close()方法停止接受新连接,等待现有连接处理完成后再退出进程。这样可以避免请求中断和数据丢失。
# 问题:Error: listen EADDRINUSE :::3000
# 解决:查找并终止占用端口的进程
# Windows系统
netstat -ano | findstr :3000
taskkill /PID <进程ID> /F
# macOS/Linux系统
lsof -ti:3000 | xargs kill -9// 问题:请求处理时间过长导致超时
// 解决:设置合适的超时时间
const server = http.createServer((req, res) => {
// 设置请求超时时间(毫秒)
req.setTimeout(30000, () => {
res.writeHead(408, { 'Content-Type': 'text/plain' });
res.end('Request Timeout');
});
// 处理请求逻辑
});
// 设置服务器超时时间
server.timeout = 30000;// 问题:长时间运行后内存使用量持续增长
// 解决:正确处理事件监听器和清理资源
const server = http.createServer((req, res) => {
// 避免重复添加事件监听器
req.on('data', handleData);
req.on('end', handleEnd);
// 确保响应正确结束
res.on('finish', () => {
// 清理资源
req.removeAllListeners();
});
});"掌握HTTP模块是Node.js Web开发的第一步,理解了底层原理,后续学习Express等框架将会事半功倍。继续保持学习热情,向全栈开发者的目标迈进!"