先来实现一个需求:创建了一个 HTTP 服务器,并在本地的 3000 端口上运行
// 导入 Node.js 内置的 http 模块
const http = require('http')
// 创建一个 HTTP 服务器并监听特定的请求
const server = http.createServer((req, res) => {
// 发送响应数据 'Hello World'
res.end('Hello World')
})
// 使服务器在指定的端口上监听连接
server.listen(3000, () => console.log('Server is running on port 3000'))
这段代码实现了一个简单的服务器功能,使得服务器能够响应客户端的请求并返回 "Hello World" 消息。同时,服务器会在本地的 3000 端口上运行,可以通过在浏览器中输入 http://localhost:3000/
来访问该服务器。
获取请求报表
const server = http.createServer((req, res) => {
// 解析请求报文
console.log(req.url)
console.log(req.method)
console.log(req.headers)
// 获取url携带的参数
const url = new URL(req.url, `http://${req.headers.host}`)
// 获取 URL 中的查询参数对象
const params = url.searchParams
console.log(params);
// 打印出查询参数对象中的所有参数
for (const [key, value] of params.entries()) {
console.log(`Param: ${key}, Value: ${value}`)
}
// 发送响应数据 'Hello World'
res.end('Hello World')
})
const url = new URL(req.url, http://${req.headers.host}):使用URL对象来解析请求的URL,这允许程序访问URL的各个组件,如协议、主机名、路径和查询字符串。
const params = url.searchParams:获取URL中的查询参数对象,这是一个能够被迭代的对象,包含了URL中的所有查询参数。
for (const [key, value] of params.entries()) {...}:打印每个查询参数的键和值,提供了一种清晰的方式来查看和处理URL中包含的所有参数。
设置响应报表
const server = http.createServer((req, res) => {
res.setHeader('Content-Type', 'text/plain')
res.statusCode = 201
res.statusMessage = 'Not Found'
res.setHeader('Access-Control-Allow-Origin', '*')
res.write('Hello, World!')
res.write('2423')
// res.end()
res.end('Hello, World!')
})
res.write() 和 res.end() 都用于向客户端发送数据,但它们的使用场景有所不同:
- res.write():这个方法用于向响应主体添加数据块。它可以被调用多次,以逐步构建响应的内容。每次调用 write() 都会将新的数据添加到已经发送的数据的后面。这种方式适用于需要逐步生成响应数据的场景,比如实时数据流或分块传输。
- res.end():这个方法表示响应的结束。它可以被视为告诉客户端,服务器已经完成了响应的发送。在调用 end() 之前,必须先调用 write() 来设置响应的内容,因为 end() 本身不接受任何参数。end() 还可以用于发送最后一块数据,并且会在发送完毕后关闭连接。如果响应已经通过 write() 设置了所有内容,那么 end() 通常用于表示响应的完成。
总结来说,write() 和 end() 是相辅相成的,write() 用于构建响应内容,end() 用于表示这些内容的结束。在处理 HTTP 请求时,确保在 end() 被调用之前,所有需要发送的数据都已经通过 write() 被发送了。