http模块基础

3 阅读2分钟

先来实现一个需求:创建了一个 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() 都用于向客户端发送数据,但它们的使用场景有所不同:

  1. res.write():这个方法用于向响应主体添加数据块。它可以被调用多次,以逐步构建响应的内容。每次调用 write() 都会将新的数据添加到已经发送的数据的后面。这种方式适用于需要逐步生成响应数据的场景,比如实时数据流或分块传输。
  2. res.end():这个方法表示响应的结束。它可以被视为告诉客户端,服务器已经完成了响应的发送。在调用 end() 之前,必须先调用 write() 来设置响应的内容,因为 end() 本身不接受任何参数。end() 还可以用于发送最后一块数据,并且会在发送完毕后关闭连接。如果响应已经通过 write() 设置了所有内容,那么 end() 通常用于表示响应的完成。

总结来说,write() 和 end() 是相辅相成的,write() 用于构建响应内容,end() 用于表示这些内容的结束。在处理 HTTP 请求时,确保在 end() 被调用之前,所有需要发送的数据都已经通过 write() 被发送了。