Node.js 的 http
模块用于创建 HTTP 服务器和客户端。它是构建网络应用(如 Web 服务器)的核心模块之一。以下是 http
模块中相关属性及方法的详尽介绍:
http
模块在使用 HTTP 功能前,需要先引入 http
模块:
const http = require('http');
http.createServer([requestListener])
requestListener
: 可选的回调函数,会在接收到请求时触发。requestListener
有两个参数:request
(客户端请求)和 response
(服务端响应)。const server = http.createServer((req, res) => {
res.statusCode = 200; // 设置 HTTP 状态码
res.setHeader('Content-Type', 'text/plain'); // 设置响应头
res.end('Hello, World!\n'); // 结束响应并发送内容
});
server.listen(port[, hostname][, backlog][, callback])
port
: 要监听的端口号。hostname
: 要监听的主机名(可选),默认为 localhost
。backlog
: 挂起的最大连接数(可选)。callback
: 服务器开始监听时的回调函数(可选)。server.listen(3000, '127.0.0.1', () => {
console.log('Server is running at http://127.0.0.1:3000/');
});
server.close([callback])
callback
: 服务器关闭后的回调函数。server.close(() => {
console.log('Server has been closed.');
});
server.on(event, listener)
'request'
: 当接收到请求时触发。'connection'
: 当客户端与服务器建立连接时触发。'close'
: 当服务器关闭时触发。'error'
: 当服务器发生错误时触发。server.on('request', (req, res) => {
console.log(`Received request for ${req.url}`);
});
server.on('error', (err) => {
console.error('Server error:', err);
});
http.IncomingMessage
)IncomingMessage
对象表示 HTTP 请求,并包含以下常用属性和方法:
req.method
GET
、POST
)。console.log(req.method); // 输出:请求方法
req.url
console.log(req.url); // 输出:请求的 URL
req.headers
console.log(req.headers); // 输出:请求头信息
req.on(event, listener)
'data'
: 当请求数据到达时触发,用于处理数据流。'end'
: 当请求数据全部接收完毕时触发。let body = '';
req.on('data', chunk => {
body += chunk;
});
req.on('end', () => {
console.log('Body:', body);
});
http.ServerResponse
)ServerResponse
对象用于向客户端发送 HTTP 响应。以下是常用属性和方法:
res.statusCode
res.statusCode = 404; // 设置状态码为 404
res.statusMessage
res.statusMessage = 'Not Found'; // 设置状态消息为 "Not Found"
res.setHeader(name, value)
res.setHeader('Content-Type', 'text/html');
res.getHeader(name)
console.log(res.getHeader('Content-Type')); // 输出:text/html
res.removeHeader(name)
res.removeHeader('Content-Type');
res.write(chunk[, encoding][, callback])
res.write('<h1>Hello, World!</h1>');
res.end([data][, encoding][, callback])
res.end('Goodbye!'); // 结束响应并发送数据
res.writeHead(statusCode[, statusMessage][, headers])
res.writeHead(200, 'OK', { 'Content-Type': 'text/plain' });
http.request(options[, callback])
options
: 包含请求方法、主机名、端口、路径、头信息等配置的对象。callback
: 请求完成后调用的回调函数,接收一个 response
对象。const options = {
hostname: 'www.example.com',
port: 80,
path: '/path',
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
};
const req = http.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log('Response:', data);
});
});
req.on('error', (e) => {
console.error(`Request error: ${e.message}`);
});
req.end(); // 发送请求
http.get(options[, callback])
http.request()
的简化版,用于 GET 请求。http.get('http://www.example.com', (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log('Response:', data);
});
});
Node.js 还提供了 https
模块用于处理 HTTPS 请求。https
模块的 API 与 http
模块几乎相同,只是它需要 SSL/TLS 证书。
const https = require('https');
const options = {
hostname: 'example.com',
port: 443,
path: '/',
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log('Response:', data);
});
});
req.on('error', (e) => {
console.error(`Request error: ${e.message}`);
});
req.end();
Node.js 还支持 HTTP/2 协议,通过 http2
模块提供支持。HTTP/2 是 HTTP 协议的增强版,提供更高效的数据传输方式。
const http2 = require('http2');
const fs = require('fs');
const server = http2.createSecureServer({
key: fs.readFileSync('server-key.pem'),
cert: fs.readFileSync('server-cert.pem')
});
server.on('stream', (stream, headers) => {
stream.respond({
'content-type': 'text/html',
':status': 200
});
stream.end('<h1>Hello, HTTP/2!</h1>');
});
server.listen(8443);
Node.js 可以使用 http-proxy
等模块来处理 HTTP 代理。HTTP 代理用于将客户端的请求转发到其他服务器。
const http = require('http');
const httpProxy = require('http-proxy');
const proxy = httpProxy.createProxyServer({});
const server = http.createServer((req, res) => {
proxy.web(req, res, { target: 'http://localhost:9000' });
});
server.listen(8000);
Node.js 提供了一些便捷的工具用于解析和设置 HTTP 头部。
res.setHeader(name, value)
和 res.getHeader(name)
req.headers
req.headers['header-name']
获取特定头信息。HTTP 状态码由三位数字组成,用于表示服务器响应的状态。常见的状态码包括:
通过 res.statusCode
可以设置响应的状态码。
res.statusCode = 404; // 设置状态码为 404
res.end('Not Found');
当处理 POST 或 PUT 请求时,通常需要处理请求体。以下是一个处理 JSON 数据的示例:
const server = http.createServer((req, res) => {
if (req.method === 'POST') {
let body = '';
req.on('data', (chunk) => {
body += chunk.toString();
});
req.on('end', () => {
const parsedData = JSON.parse(body);
console.log('Received data:', parsedData);
res.end('Data received');
});
} else {
res.end('Only POST requests are supported');
}
});
server.listen(3000);
Node.js 的 http
模块提供了强大的工具来构建 HTTP 服务器和客户端。通过理解和使用这些属性和方法,你可以创建功能丰富的网络应用,并处理从基本请求响应到高级 HTTP/2 的各种需求。