1.手写服务器
// 导入http模块
const http=require('http')
// 创建服务器
const app=http.createServer()
/*
监听客户端的请求
req 客户端的请求对象
res 服务器的响应对象
*/
app.on('request',(res,req)=>{ //on方法在后面也会多次用到,目前可以看成一个开启监听的api
console.log('有人访问了我的服务器')
req.end('hello node')
})
/*
调配监听端口服务
port 端口号
host 设置ip地址,不设置或者写'localhost'均为主机地址,学习阶段一般不设置
callback 回调函数
*/
app.listen(3000,()=>{
console.log('http://127.0.0.1:3000')
})
2.请求分为get请求和post请求
get请求不能传输数据 post请求专门用来传输数据 在设置请求时,在每次请求后都要调用end方法或者send方法来终止一次请求,因为http是无连接的,每一次会话都要进行一次终止.
3.根据不同的请求发送不同的资源
主要思路是根据两种请求中req的url属性的不同来判断,给与不同的资源.这是手写时的思路
const fs = require('fs')
const path = require('path')
const http = require('http')
const app = http.createServer()
app.on('request', (req, res) => { //通过on监听请求
if (req.url === '/index.html') {
fs.readFile(path.join(__dirname, './views', req.url), (err, data) => {
if (err) return console.log(err.message)
res.end(data)
})
} else if (req.url === '/about.html') {
fs.readFile(path.join(__dirname, './views', req.url), (err, data) => {
if (err) return console.log(err.message)
res.end(data)
})
} else if (req.url === '/2.webp') {
fs.readFile(path.join(__dirname, './views', req.url), (err, data) => {
if (err) return console.log(err.message)
res.end(data)
})
} else if (req.url === '/api/post' && req.method === 'POST') {
res.end('post')
} else {
res.end('404')
}
})
app.listen(5000, ['127.0.0.1'], () => {
console.log('本地服务:http://127.0.0.1:5000')
})
手动进行静态资源托管
手写的思路:通过node的fs模块的读取文件方法结合req的url路径去锁定目标文件
const fs = require('fs')
const path = require('path')
const http = require('http')
const app = http.createServer()
app.on('request', (req, res) => {
getStaticFile(req, res)
})
app.listen(5000, ['127.0.0.1'], () => {
console.log('本地服务:http://127.0.0.1:5000')
})
// 封装静态资源托管
function getStaticFile(req, res) { //读取views文件夹下目标url路径的文件数据,再通过end传输给客户端
fs.readFile(path.join(__dirname, './views', req.url), (err, data) => {
if (err) return console.log(err.message)
res.end(data)
})
}
手写中间件以了解中间件的运行原理
中间件需要在服务器的use方法上'激活'--也可以理解为use启动了中间件的监听,这样每次访问数据时都会运行中间件的算法.
具体代码内容在index手写中间件.js文件中
node的express模块也同样内置了中间件的使用方法
// app为自己手写的服务器,urlencodee可以监听请求中传输的为对象的数据.
app.use(express.urlencoded({ extended: false }))
// json用来监听请求中传输的字符串数据
app.use(express.json())
对一些node方法的理解
事件触发器,在node的event模块中内置了EventEmitter对象,该对象有两个公开的方法on和emit,emit还没学,先讲讲on,它们都是用来监听事件的,目前使用过的事件有,data(当传输数据时触发),end(在请求会话结束的事件)
use方法,目前理解为类似事件的监听开启器.