Node.js 的 http2
模块支持 HTTP/2 协议,HTTP/2 是 HTTP 协议的升级版本,旨在提高 Web 性能,通过多路复用、头部压缩和服务器推送等功能优化数据传输。http2
模块在 Node.js v8.4.0 及更高版本中可用,默认处于实验性阶段,但在更高版本中已经稳定。下面是 Node.js http2
模块的相关属性及方法的详细介绍。
http2
模块首先,需要引入 http2
模块:
const http2 = require('http2');
http2.createServer([options][, onRequest])
options
: 配置对象,可选,用于指定服务器的设置(如超时、允许的请求头、请求头大小限制等)。onRequest
: 回调函数,可选,接收 request
和 response
对象,与传统的 HTTP 服务器类似。const server = http2.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello, HTTP/2!');
});
server.listen(3000, () => {
console.log('HTTP/2 server running at http://localhost:3000');
});
http2.createSecureServer([options][, onRequest])
options
: 配置对象,必须包含 SSL/TLS 证书和私钥。onRequest
: 回调函数,可选,接收 request
和 response
对象。const fs = require('fs');
const server = http2.createSecureServer({
key: fs.readFileSync('server-key.pem'),
cert: fs.readFileSync('server-cert.pem')
}, (req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello, Secure HTTP/2!');
});
server.listen(8443, () => {
console.log('Secure HTTP/2 server running at https://localhost:8443');
});
http2.connect(authority[, options][, listener])
authority
: 目标服务器的 URL。options
: 配置对象,可选,用于设置连接的各种选项(如 ALPN 协议、TLS 设置等)。listener
: 可选的回调函数,在 connect
事件发生时调用。const client = http2.connect('https://localhost:8443', {
ca: fs.readFileSync('server-cert.pem') // 信任自签名证书
});
client.on('connect', () => {
console.log('Connected to server!');
});
client.on('error', (err) => console.error(err));
HTTP/2 使用流来管理客户端和服务器之间的数据传输。一个流可以承载一个请求/响应周期。
session.request(headers[, options])
headers
: 请求头对象,必须包含 :method
和 :path
字段。options
: 配置对象,可选,用于设置流选项(如优先级、超时等)。const req = client.request({ ':method': 'GET', ':path': '/' });
req.on('response', (headers) => {
console.log('Response headers:', headers);
});
req.on('data', (chunk) => {
console.log('Response body:', chunk.toString());
});
req.on('end', () => {
console.log('Response ended.');
client.close();
});
req.end();
stream.respond(headers[, options])
headers
: 响应头对象。options
: 配置对象,可选,用于设置流选项。const server = http2.createServer();
server.on('stream', (stream, headers) => {
stream.respond({ ':status': 200, 'content-type': 'text/plain' });
stream.end('Hello, HTTP/2!');
});
server.listen(3000);
stream.pushStream(headers[, options][, callback])
headers
: 请求头对象。options
: 配置对象,可选,用于设置流选项。callback
: 回调函数,当流已经创建或发生错误时调用。server.on('stream', (stream, headers) => {
stream.respond({ ':status': 200, 'content-type': 'text/html' });
stream.end('<h1>Hello, HTTP/2!</h1>');
// 服务器推送
stream.pushStream({ ':path': '/pushed' }, (err, pushStream) => {
if (err) throw err;
pushStream.respond({ ':status': 200, 'content-type': 'text/plain' });
pushStream.end('This is a pushed resource.');
});
});
stream.on(event, listener)
'aborted'
: 当请求或响应被中止时触发。'close'
: 当流关闭时触发。'data'
: 当有数据可读时触发。'end'
: 当数据流结束时触发。'error'
: 当发生错误时触发。stream.on('data', (chunk) => {
console.log('Received data:', chunk.toString());
});
stream.on('end', () => {
console.log('Stream ended.');
});
HTTP/2 会话用于管理客户端与服务器之间的多个流。
session.settings([settings][, callback])
settings
: 一个对象,用于配置会话(如最大帧大小、最大并发流数等)。callback
: 设置完成后的回调函数。client.settings({
enablePush: true
}, () => {
console.log('Settings updated.');
});
session.ping([payload][, callback])
payload
: 可选的 8 字节数据。callback
: 回调函数,在接收到 pong 响应时调用。client.ping((err, duration) => {
if (err) throw err;
console.log(`Ping duration: ${duration}ms`);
});
session.close([callback])
callback
: 可选的回调函数,会话关闭时调用。client.close(() => {
console.log('Client session closed.');
});
session.destroy([error][, code])
error
: 可选的错误对象,解释销毁的原因。code
: 可选的错误代码。client.destroy(new Error('Something went wrong'));
session.on(event, listener)
'close'
: 当会话关闭时触发。'connect'
: 当客户端与服务器成功连接时触发。'error'
: 当会话发生错误时触发。'goaway'
: 当接收到 GOAWAY 帧时触发,表示服务器要关闭连接。'ping'
: 当接收到 ping 帧时触发。'stream'
: 当服务器端创建新流时触发。client.on('error', (err) => {
console.error('Session error:', err);
});
client.on('goaway', (errorCode, lastStreamID, opaqueData) => {
console.log('Received GOAWAY frame');
});
在 HTTP/2 中,状态码和头信息在处理请求和响应时起着重要作用。
:method
: HTTP 方法,例如 GET
或 POST
。path**: 请求的路径,例如
/index.html`。
:authority
: 请求的主机和端口,例如 example.com
。:scheme
: 请求的协议,例如 https
。stream.respond()
设置。stream.respond({
':status': 200,
'content-type': 'text/html'
});
http2
模块为 Node.js 提供了对 HTTP/2 协议的全面支持。通过多路复用、服务器推送、头部压缩等特性,可以显著提升网络性能。理解和使用这些属性和方法可以帮助开发者充分利用 HTTP/2 的优势来构建高效的网络应用。