1 创建 Web 服务器

  1. 创建服务器app = http.createServer()
  2. 监听请求app.on('request', (req, res) => {},req 为接收的请求信息,res 为发送的响应信息
  3. 监听端口app.listen(3000)
  4. 解析 urlurl.parse(req.url, true)
  5. 路由转发
  6. 返回响应res.end()

创建服务器、监听请求、监听端口可简写为:

1
http.createServer((req, res) => {}).listen(3000)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// 用于创建网站服务器的模块
const http = require('http')
// 用于处理url地址
const url = require('url')
// app对象就是网站服务器对象
const app = http.createServer()
// 当客户端有请求来的时候
app.on('request', (req, res) => {
// 获取请求方式
// req.method.toLowerCase()
console.log(req.method.toLowerCase())

// 获取请求地址
// req.url
console.log(req.url)

// 获取请求报文信息
// req.headers
console.log(req.headers['accept'])

res.writeHead(200, {
'content-type': 'text/html;charset=utf8',
})

console.log(req.url)
// 1) 要解析的url地址
// 2) 将查询参数解析成对象形式
let { query, pathname } = url.parse(req.url, true)
console.log(query.name)
console.log(query.age)

if (pathname === '/index' || pathname === '/') {
res.end('<h2>欢迎来到首页</h2>')
} else if (pathname === '/list') {
res.end('welcome to listpage')
} else {
res.end('not found')
}
})
// 监听端口
app.listen(3000)
console.log('网站服务器启动成功')

2 post 请求

  1. querystring 模块解析 post 请求主体querystring.parse()
  2. post 主体信息分批抵达服务器,data 事件监听每批到达数据,end 事件监听数据传输完毕事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 用于创建网站服务器的模块
const http = require('http')
// app对象就是网站服务器对象
const app = http.createServer()
// 处理请求参数模块
const querystring = require('querystring')
// 当客户端有请求来的时候
app.on('request', (req, res) => {
// post参数是通过事件的方式接受的
// data 当请求参数传递的时候出发data事件
// end 当参数传递完成的时候出发end事件

let postParams = ''

req.on('data', (params) => {
postParams += params
})

req.on('end', () => {
console.log(querystring.parse(postParams))
})

res.end('ok')
})
// 监听端口
app.listen(3000)
console.log('网站服务器启动成功')

3 请求静态资源

  1. fs 模块获取资源位置
  2. mime 模块用于根据请求资源后缀名自动获取 content-type
  3. path 模块连接路径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
const http = require('http')
const url = require('url')
const path = require('path')
const fs = require('fs')
// 用于根据请求资源后缀名自动获取content-type
const mime = require('mime')

const app = http.createServer()

app.on('request', (req, res) => {
// 获取用户的请求路径
let pathname = url.parse(req.url).pathname

pathname = pathname === '/' ? '/default.html' : pathname

// 将用户的请求路径转换为实际的服务器硬盘路径
let realPath = path.join(__dirname, 'public' + pathname)

// 根据请求资源后缀名自动获取content-type
let type = mime.getType(realPath)

// 读取文件
fs.readFile(realPath, (error, result) => {
// 如果文件读取失败
if (error != null) {
res.writeHead(404, {
'content-type': 'text/html;charset=utf8',
})
res.end('文件读取失败')
return
}

res.writeHead(200, {
'content-type': type,
})

res.end(result)
})
})

app.listen(3000)
console.log('服务器启动成功')