http 模块是 Node.js 官方提供的、用来创建 Web 服务器的模块。
node.js提供了http模块,其中封装了一个http服务器和一个建议的http客户端。
http.server是一个基于事件的http服务器,内部由c++实现,接口由JavaScript封装。
http.request则是一个http客户端工具,用户向服务器发送请求。
HTTP 模块提供了 5 个类:
http.serve的事件
http.server 是一个基于事件的http服务器,所有请求都被封装成独立的事件,开发者只有对它的事件编写相应函数,实现http服务器的所有功能。它继承于EventEmitter,提供了以下事件:
const http = require('http')
const server = http.createServer()
// 使用服务器实例 .on() 方法,为服务器绑定一个 request 事件
server.on('request',(req,res)=>{
//只要有客户端来请求我们自己的服务器,就会触发 request 事件,从而调用这个事件处理函数
console.log('Someone visit our web server.')
})
//调用 server.listen(端口号,cb回调)方法,即可启动 Web 服务器
server.listen(80,()=>{
console.log('http server running at http://127.0.0.1')
})
在向服务器发送请求时,我们会携带很多信息,比如:
只要服务器接收到了客户端的请求,就会调用通过 server.on() 为服务器绑定的 request 事件处理函数。如果想在事件处理函数中,访问与客户端相关的数据或属性,可以使用如下的方式:
const http = require('http')
const server = http.createServer()
server.on('request',()=>{
// req.url 是客户端请求的 URL 地址
const url = req.url
// req.method 是客户端请求的 method 类型
const method = req.method
const str = `Your request url is ${url},and request method is ${method}`
console.log(str)
})
server.listen(80,()=>{
console.log('server running at http://127.0.0.1')
})
但当打开页面的时候,会发现我们并没有拿到东西,或者说客户端没有响应一些内容,这我们就要用到下面的方法。
在服务器的 request 事件处理函数中,如果想访问与服务器相关的数据或属性,可以使用如下的方式:
const http = require('http')
const server = http.createServer()
server.on('request',(req,res)=>{
// req.url 是客户端请求的 URL 地址
const url = req.url
// req.method 是客户端请求的 method 类型
const method = req.method
const str = `Your request url is ${url},and request method is ${method}`
console.log(str)
// 调用 res.end() 方法,向客户端响应一些内容,并结束指定内容
res.end(str)
})
server.listen(80,()=>{
console.log('server running at http://127.0.0.1')
})
const http = require('http')
const server = http.createServer()
server.on('request',(req,res)=>{
// 定义一个字符串,包含中文内容
const str = `您请求的 URL 地址是 ${req.url}, 请求的 method 类型为 ${req.method}`
// 调用 res.end() 方法来讲内容响应给客户端
res.end(str)
})
server.listen(80,()=>{
console.log('server running at http://127.0.0.1')
})
会发现这里面都是乱码,此时我们就要设置响应头来解决乱码问题
const http = require('http')
const server = http.createServer()
server.on('request',(req,res)=>{
// 定义一个字符串,包含中文内容
const str = `您请求的 URL 地址是 ${req.url}, 请求的 method 类型为 ${req.method}`
// 为了解决中文乱码问题,需要设置响应头 Content-Type 的值为 text/html;charset=utf-8
res.setHeader('Content-Type','text/html;charset=utf-8')
// 调用 res.end() 方法来讲内容响应给客户端
res.end(str)
})
server.listen(80,()=>{
console.log('server running at http://127.0.0.1')
})
const http = require('http')
const server = http.createServer()
server.on('request',(req,res)=>{
//获取请求的 url 地址
const url = req.url
//设置默认的内容为 404 Not Found
let content = '404 Not Found
'
//如果用户请求的是首页
if (url === '/' || url === '/index.html') {
content = '首页
'
} else if (url === '/about.html') { //如果用户请求的是关于页面
content = '关于页面
'
}
res.setHeader('Content-Type','text/html;charset=utf-8')
res.end(content)
})
server.listen(80,()=>{
console.log('server running at http://127.0.0.1')
})
axios库可以在浏览器中使用,也可以在Node中使用:
const http = require('http')
const fs = require('fs')
const qs = require('querystring')
const server = http.createServer((req, res) => {
if (req.url === '/upload') {
if (req.method === 'POST') {
req.setEncoding('binary')
let body = ''
const boundary = req.headers['content-type'].split(';')[1].replace(' boundary=', '')
// console.log(boundary)
req.on('data', (data) => {
body += data
})
// 监听写入结束
req.on('end', () => {
// 1.获取image/png的位置
const payload = qs.parse(body, "\r\n", ": ")
const type = payload["Content-Type"]
const typeIndex = body.indexOf(type) // 拿到image/jpeg的索引位置
const typeLength = type.length // 拿到image/jpeg这个字符串的长度
let imageData = body.substring(typeIndex + typeLength)
// 3. 将image/jpeg后面的两个空格去掉
// imageData = imageData.replace('\r\n\r\n', '')
imageData = imageData.replace(/^\s\s*/, '')
// 4. 将最后的boundary去除掉
imageData = imageData.substring(0, imageData.indexOf(`--${boundary}--`))
fs.writeFile('./foo.jpg', imageData, {encoding: 'binary'}, (err) => {
res.end('文件上传成功~')
})
console.log('文件上传成功')
res.end('文件上传成功')
})
}
}
})
server.listen(8000, '0.0.0.0', () => {
console.log('文件上传服务器开启成功')
})