1.http内置模块
如果你上班不方便听语音课可以看我 我把老师语音教的基本做了详细的记录
http模块基础使用
p10 010-内置模块-http模块-1
const http = require('http')
// 创建服务器
http.createServer((req,res)=>{
//这里的回调函数可以接收到浏览器传递来的参数 也就是前端带的参数
//根据前端给的参数 返回需要渲染的内容
//服务器启动成功后就启动了监听 只要访问就能执行localhost:3000 就会执行这里的回调函数
// res.write("hello world")
res.end("[1,2,3]")
// write可多次 但是最终都要end 不然浏览器认为你还有话要说,浏览器就会一直要等 等久了就要超时 哈哈哈
// end中也可以传递参数 也是作为最终的响应结果
// end之后不能再写其他逻辑或者write了
// 传递的参数必须是字符串 如"[1,2,3]" ,"hello world" 或者需要你JSON.stringify转化下
}).listen(3000, ()=>{
console.log('server start')
// 服务器创建成功就能执行这个回调 并打印ok
})
//服务器启动成功后就启动了监听 只要访问就能执行localhost:3000
const http = require('http')
// 创建服务器
http.createServer((req,res)=>{
res.writeHead(200, {
'Content-Type':'text/html;charset=utf-8'
// 不管浏览器需不需要 最好都加上 如果不写浏览器也能正常解析 写这些能保证所有的浏览器都能正确的解析
// 改成错误的'text/plain' 浏览器展示的则是html的文本
// 告诉浏览器都分别对应解析什么类型的资源 这样的话浏览器才能正常的解析我们的资源
// 这里的200 就是对应的状态码 或者是404之类的
// 这里还需要指定编码方式 utf-8 这样才能够正确的解析中文
})
//返回一个html页面
res.write(`
<html>
<b>
hello node (这里写中文会乱码)
</b>
</html>
`)
res.end()
}).listen(3000, ()=>{
console.log('server start')
// 服务器创建成功就能执行这个回调 并打印ok
})
// 以上是http模块最简单的使用
总结:
- createServer 回调函数是最核心的模块
- req 浏览器传递来的 res 我们给浏览器的响应结果
- 指定contenttype 和charset的使用能让浏览器正确的解析我们的资源
- 我们可以cosplay自己是后端,可以在res.write中写html解构字符串,相当于返回了页面资源,如果我们返回一个数组或者json字符串,就像是写了接口。
http路由
p11 011-内置模块-http模块-2
本节主要内容:
具体是借助req对象中不同的路径值去判断,老师说后面有专门讲路由的课程,此处只是做一个简单的尝试。
打印req对象查看具体信息:console.log(req)
咱就是说req打印出来的东西有点太多了 有兴趣的话可以自己打印看下 这里就无法展开了。
重点使用了他身上常用的req.url属性,req.url属性的值就是前端在浏览器中访问的url地址;
这里老师将不同url对应不同的返回值这块逻辑抽离成了一个函数
const http = require('http')
// 创建服务器
http.createServer((req,res)=>{
// console.log(req)
res.writeHead(200, {
'Content-Type':'text/html;charset=utf-8'
})
res.write(renderMethod(req.url))
res.end()
}).listen(3001, ()=>{
console.log('server start')
// 服务器创建成功就能执行这个回调 并打印ok
})
function renderMethod(url){
switch(url){
case "/home":
return ` <html>
<b>
home页面
</b>
</html>`
case "/list":
return ` <html>
<b>
list页面
</b>
</html>`
default:
return ` <html>
<b>
404 not found
</b>
</html>`
}
}
函数renderMethod方法根据req.url属性可以实现前端访问不同的路由地址,对应返回不同的页面内容
假设你现在cosplay后端写接口也是相同的道理
既可以返回html字符串 也可以返回数据
function renderMethod(url){
switch(url){
case "/api/login":
return
"{
token:"2goahgiopa"
}"
case "/api/info":
return "["list1","list2","list3"]"
default:
return "{
data:null
code:404
}"
}
}
对于404页面或者其他异常情况,单独的封装 可以通过封装一个renderStatus(req.url)方法对应展示不同状态码。
res.writeHead(200, {
‘Content-Type’:’text/html;charset=utf-8′
})
res.writeHead(renderStatus(req.url), {
‘Content-Type’:’text/html;charset=utf-8′
})
function renderStatus(url){
var arr = [“/home”,”/list”]
return arr.includes(url)? 200: 404
}
这样写可能比较乱,后面可以使用express的路由解决方案
目前可以优化的是可以将renderMethod renderStatus 这两个方法抽离到独立的文件中,使用模块导出的方式,主模块通过引用的方式使用。
以上是最简单的node服务器模型
创建服务器的等价写法
两种口味的写法,你喜欢哪种写法就怎么写,结果是一样的
var server = http.createServer();
server.on('request',(req,res)=>{
res.writeHead(200,{
'Content-Type':"application/json"
})
res.end(JSON.stringify({data:"hello world"}))
})
server.listen(8000)
对于前端带参数:?拼接的 路由中带参数中 req.url中截取?之前的
然后把参数取出来
2. url内置模块
目前我们创建了一个基本的服务器模型;但是有时候请求路径中带参的时候,就无法无法匹配我们预设的一些路径了(如renderMethod中定义的一些路径),此时可以使用node内置的url模块,可以将参数帮我们取出来,把路径截取出来,可以完美的解决这个问题。
首先引入url模块;
使用url.parse()方法 parse解析嘛
测试方法是:
他这个参数
插一个题外话:
自动重启服务器小工具,npm i nodemon -g
这个安装后使用nodemon 指令
如果服务代码如果改变保存后,会自动重启服务器
node-dev 这个小工具也可以实现这个效果;
任选其一都可以。
除了pathname这个路由参数,
还有query参数,这个query参数如果能是个对象的话就好了,
这时候只要parse方法第二个参数传个true就可以了,如下图所示就是测试的结果
url.parse(req.url,true)
直接转换好了,太好了!
这就是url小模块;
parse方法可以将url解析出路径,传参等,反过来,format方法也可以组装成url地址。是一对反义词。
resolve方法
能够进行url的拼接,后面还有可以给你拼接在一起;学习了以后可以灵活使用,
都是关于地址的拼接和格式化
演示resolve方法有/和无/的区别:
var a = url.resolve('one/two/three','four')
console.log(a) // 'one/two/four' three后面没有/会被后面待拼接的参数替换掉
加上/能够给你连起来
带地址的情况:
var b = url.resolve('http://example.com/aaa/bbb/','one')
console.log(b) // 'http://example.com/one'
带地址的情况,后面的路径都会被第二个参数替换掉,不管后面有多少,他会替换域名后的的所有内容
简单总结下:
- 在以上写接口的过程中,遇到了取url中携带参数的问题,引出了url模块
- url模块的parse方法可以将携带参数直接转化为对对象
- format方法和resolve方法都可以用来做路由拼接
告一段落;下面会继续学习