likes
comments
collection
share

Nodejs内置模块-如果你上班不方便听语音课可以看我

作者站长头像
站长
· 阅读数 11

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模块最简单的使用

总结:

  1. createServer 回调函数是最核心的模块
  2. req 浏览器传递来的 res 我们给浏览器的响应结果
  3. 指定contenttype 和charset的使用能让浏览器正确的解析我们的资源
  4. 我们可以cosplay自己是后端,可以在res.write中写html解构字符串,相当于返回了页面资源,如果我们返回一个数组或者json字符串,就像是写了接口。

http路由

p11 011-内置模块-http模块-2

本节主要内容: 具体是借助req对象中不同的路径值去判断,老师说后面有专门讲路由的课程,此处只是做一个简单的尝试。

打印req对象查看具体信息:console.log(req) 咱就是说req打印出来的东西有点太多了 有兴趣的话可以自己打印看下 这里就无法展开了。

Nodejs内置模块-如果你上班不方便听语音课可以看我

重点使用了他身上常用的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解析嘛

测试方法是:

Nodejs内置模块-如果你上班不方便听语音课可以看我

他这个参数

插一个题外话: 自动重启服务器小工具,npm i nodemon -g 这个安装后使用nodemon 指令 如果服务代码如果改变保存后,会自动重启服务器

node-dev 这个小工具也可以实现这个效果;

任选其一都可以。

除了pathname这个路由参数, 还有query参数,这个query参数如果能是个对象的话就好了, 这时候只要parse方法第二个参数传个true就可以了,如下图所示就是测试的结果

url.parse(req.url,true)

Nodejs内置模块-如果你上班不方便听语音课可以看我

直接转换好了,太好了!

这就是url小模块; parse方法可以将url解析出路径,传参等,反过来,format方法也可以组装成url地址。是一对反义词。

Nodejs内置模块-如果你上班不方便听语音课可以看我

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'

带地址的情况,后面的路径都会被第二个参数替换掉,不管后面有多少,他会替换域名后的的所有内容

简单总结下:

  1. 在以上写接口的过程中,遇到了取url中携带参数的问题,引出了url模块
  2. url模块的parse方法可以将携带参数直接转化为对对象
  3. format方法和resolve方法都可以用来做路由拼接

告一段落;下面会继续学习