📅  最后修改于: 2023-12-03 15:17:57.915000             🧑  作者: Mango
Node.js 中的 http 模块是一个基于事件驱动的 HTTP 服务器和客户端库。它是 Node.js 标准库的一部分,可以使我们轻松地处理 HTTP 请求和响应。在本篇文章中,我们将深入介绍 Node.js 中的 http 模块,包括如何创建 HTTP 服务器和客户端,如何处理请求和响应,以及如何处理复杂的 HTTP 操作。
要创建一个 HTTP 服务器,我们需要首先引入 http 模块:
const http = require('http')
然后,我们可以使用 http.createServer() 方法创建一个服务器实例:
const server = http.createServer((req, res) => {
// 处理请求和响应
})
在上述代码中,我们创建了一个 HTTP 服务器,并为其提供了一个回调函数,以处理客户端请求和服务器的响应。在这个回调函数中,我们可以通过 req 参数获取所有来自客户端的请求信息,并通过 res 参数向客户端发送响应信息。
接下来,我们需要让服务器监听指定的端口,以便客户端可以连接到服务器。可以使用 server.listen() 方法来完成此操作:
const port = 3000
server.listen(port, () => {
console.log(`Server started on port ${port}`)
})
在上述代码中,我们将服务器监听端口设置为 3000,并使用回调函数来打印一条消息,以表明服务器已经启动并正在监听连接。
现在,我们已经成功创建了一个简单的 HTTP 服务器。下面,我们将介绍如何处理请求和响应。
在 http.createServer() 方法中,我们可以通过 req 参数获取来自客户端的所有请求信息。例如,在以下代码中,我们从请求URL中获取查询参数,并以json格式发送给客户端:
const server = http.createServer((req, res) => {
const { pathname, searchParams} = new URL(req.url, `http://${req.headers.host}`)
const username = searchParams.get('username')
const responseJson = {
message: `Hello ${username}`
}
res.setHeader('Content-Type', 'application/json')
res.writeHead(200)
res.end(JSON.stringify(responseJson))
})
在上述代码中,我们从 req.url 中解析出查询参数,并将其用作响应消息的一部分。使用res.setHeader(),res.writeHead(),res.end()方法向客户端发送响应消息。
通过这种方式,我们可以处理客户端发送的所有不同类型的请求,并返回我们想要发送的任何类型的响应。
在 Node.js 中,我们也可以创建 HTTP 客户端。可以使用 http.request() 方法和 options 对象来创建客户端请求。例如,在以下代码中,我们创建了一个 HTTP 客户端请求来获取一个网页:
const options = {
host: 'www.example.com',
path: '/index.html'
}
const req = http.request(options, (res) => {
console.log(`Got response: ${res.statusCode}`)
res.on('data', (chunk) => {
console.log(`BODY: ${chunk}`)
})
res.on('end', () => {
console.log('No more data in response.')
})
})
req.on('error', (e) => {
console.error(`problem with request: ${e.message}`)
})
req.end()
在上述代码中,我们创建了一个使用 http.request() 方法创建的 HTTP 客户端请求,并定义了选项:主机和路径。然后,我们使用 req.on() 方法来监听来自服务器的响应,并将响应数据打印到控制台中。
Node.js 的 http 模块中还有许多其他有用的功能,可用于处理复杂的 HTTP 操作。例如,我们可以使用 http.IncomingMessage 类来访问请求信息的各个部分,如:Cookie、头信息和状态等。同样,我们可以使用 http.OutgoingMessage 类来对发送到客户端的响应信息进行更细粒度的控制。
http 模块还支持轻松创建 WebSocket 服务器和客户端,使用 http 模块实现 HTTP/2、HTTP/3,实现 TLS/SSL 安全连接等等。
总之,Node.js 中的 http 模块为处理 HTTP 服务器和客户端提供了便利,并提供了许多有用的功能,以处理复杂的 HTTP 操作和确保应用程序的高可用性和性能。
以上便是 Node.js 中的 http 模块的介绍,最后附上全部代码:
const http = require('http')
const port = 3000
const server = http.createServer((req, res) => {
const { pathname, searchParams} = new URL(req.url, `http://${req.headers.host}`)
const username = searchParams.get('username')
const responseJson = {
message: `Hello ${username}`
}
res.setHeader('Content-Type', 'application/json')
res.writeHead(200)
res.end(JSON.stringify(responseJson))
})
server.listen(port, () => {
console.log(`Server started on port ${port}`)
})
const options = {
host: 'www.example.com',
path: '/index.html'
}
const req = http.request(options, (res) => {
console.log(`Got response: ${res.statusCode}`)
res.on('data', (chunk) => {
console.log(`BODY: ${chunk}`)
})
res.on('end', () => {
console.log('No more data in response.')
})
})
req.on('error', (e) => {
console.error(`problem with request: ${e.message}`)
})
req.end()