首页 > 专栏 > 前端 > 文章详情
Node.js 笔记 - 第六节 - Node.js 内置功能 发布于:2021-02-15 08:12:36   原创发表   查看:6  讨论:0
一、fs模块Q91易塔云建站-模板下载,web开发资源,技术博客
Q91易塔云建站-模板下载,web开发资源,技术博客
fs模块最重要的一个功能就是异步读取文件(readFile),第一个参数文件,第二个参数是回调函数。
fs.readFile('文件名', (err, data) => {Q91易塔云建站-模板下载,web开发资源,技术博客
  if (err) throw err;Q91易塔云建站-模板下载,web开发资源,技术博客
  console.log(data);Q91易塔云建站-模板下载,web开发资源,技术博客
});
我们现在要结合这个方法进行一个页面的读取内容。
var http = require("http");Q91易塔云建站-模板下载,web开发资源,技术博客
var fs = require("fs");Q91易塔云建站-模板下载,web开发资源,技术博客
// 创建服务器Q91易塔云建站-模板下载,web开发资源,技术博客
var server = http.createServer(function(req,res){Q91易塔云建站-模板下载,web开发资源,技术博客
  fs.readFile("./public/zhoujielun.html",function(err,data) {Q91易塔云建站-模板下载,web开发资源,技术博客
    res.end(data)Q91易塔云建站-模板下载,web开发资源,技术博客
  })Q91易塔云建站-模板下载,web开发资源,技术博客
})Q91易塔云建站-模板下载,web开发资源,技术博客
// 监听Q91易塔云建站-模板下载,web开发资源,技术博客
server.listen(3000)
Q91易塔云建站-模板下载,web开发资源,技术博客
Q91易塔云建站-模板下载,web开发资源,技术博客
二、路由(※)Q91易塔云建站-模板下载,web开发资源,技术博客
Q91易塔云建站-模板下载,web开发资源,技术博客
上面的案例,我无论输入什么URL都会显示zhoujielun.html这个页面。
var server = http.createServer(function(req,res){Q91易塔云建站-模板下载,web开发资源,技术博客
  fs.readFile("./public/zhoujielun.html",function(err,data) {Q91易塔云建站-模板下载,web开发资源,技术博客
    res.end(data)Q91易塔云建站-模板下载,web开发资源,技术博客
  })Q91易塔云建站-模板下载,web开发资源,技术博客
})
Q91易塔云建站-模板下载,web开发资源,技术博客
上面的路由地址是随便写的,你会发现无论路由什么样,都会显示该页面,此时我们就可以利用这个特性完成我们的路由设计。Q91易塔云建站-模板下载,web开发资源,技术博客
我们可以通过req.url()得到用户输入的URL地址。
var server = http.createServer(function(req,res){Q91易塔云建站-模板下载,web开发资源,技术博客
  // 设置字符集Q91易塔云建站-模板下载,web开发资源,技术博客
  res.setHeader("Content-Type","text/html;charset=UTF8");Q91易塔云建站-模板下载,web开发资源,技术博客
  if(req.url === "/star/zhoujielun") {Q91易塔云建站-模板下载,web开发资源,技术博客
    fs.readFile("./public/zhoujielun.html",function(err,data) {Q91易塔云建站-模板下载,web开发资源,技术博客
      res.end(data)Q91易塔云建站-模板下载,web开发资源,技术博客
    })Q91易塔云建站-模板下载,web开发资源,技术博客
  } else if(req.url === "/star/wanglihong"){Q91易塔云建站-模板下载,web开发资源,技术博客
    fs.readFile("./public/wanglihong.html",function(err,data) {Q91易塔云建站-模板下载,web开发资源,技术博客
      res.end(data)Q91易塔云建站-模板下载,web开发资源,技术博客
    })Q91易塔云建站-模板下载,web开发资源,技术博客
  } else {Q91易塔云建站-模板下载,web开发资源,技术博客
    res.end("无页面显示")Q91易塔云建站-模板下载,web开发资源,技术博客
  }Q91易塔云建站-模板下载,web开发资源,技术博客
})
比如我们访问/star/zhoujielunQ91易塔云建站-模板下载,web开发资源,技术博客
Q91易塔云建站-模板下载,web开发资源,技术博客
再比如我们要访问/star/wanglihongQ91易塔云建站-模板下载,web开发资源,技术博客
Q91易塔云建站-模板下载,web开发资源,技术博客
我们之前的认知是路由即文件夹,但是我们Node.js颠覆了我们的认知,通过路由进行页面的读取,这个就是顶层路由设计。Q91易塔云建站-模板下载,web开发资源,技术博客
顶层路由设计:Q91易塔云建站-模板下载,web开发资源,技术博客
△:物理文件层级的URL是没有任何关系的;Q91易塔云建站-模板下载,web开发资源,技术博客
△:Node.js是可以做顶层路由设计的!一个页面的URL是可以自定义的;Q91易塔云建站-模板下载,web开发资源,技术博客
△:用户输入的URL是可以映射任何HTML页面的;Q91易塔云建站-模板下载,web开发资源,技术博客
现在有很多大型网站都是这种顶层路由设计,比如知乎。Q91易塔云建站-模板下载,web开发资源,技术博客
https://www.zhihu.com/people/guozi-51-501/answer        用户的回答Q91易塔云建站-模板下载,web开发资源,技术博客
https://www.zhihu.com/people/guozi-51-501/zvideos       用户的提问Q91易塔云建站-模板下载,web开发资源,技术博客
https://www.zhihu.com/people/guozi-51-501/asks            用户的提问Q91易塔云建站-模板下载,web开发资源,技术博客
https://www.zhihu.com/people/guozi-51-501/posts          用户的文章Q91易塔云建站-模板下载,web开发资源,技术博客
https://www.zhihu.com/people/guozi-51-501/columns     用户的专栏Q91易塔云建站-模板下载,web开发资源,技术博客
老一代的路由实际上都是映射服务器的物理文件夹目录。比如https://weibo.com/p/1005052970323452/photos?from=page_100505&mod=TAB#place。Q91易塔云建站-模板下载,web开发资源,技术博客
Q91易塔云建站-模板下载,web开发资源,技术博客
三、模仿知乎路由的顶层设计。
var server = http.createServer(function(req,res){Q91易塔云建站-模板下载,web开发资源,技术博客
  // 设置字符集Q91易塔云建站-模板下载,web开发资源,技术博客
  res.setHeader("Content-Type","text/html;charset=UTF8");Q91易塔云建站-模板下载,web开发资源,技术博客
  // 得到用户的urlQ91易塔云建站-模板下载,web开发资源,技术博客
  var url = req.url;Q91易塔云建站-模板下载,web开发资源,技术博客
  // 使用正则表达式进行信息的获取Q91易塔云建站-模板下载,web开发资源,技术博客
  var arr = url.match(/\/user\/(.+)\/(.+)$/);Q91易塔云建站-模板下载,web开发资源,技术博客
  console.log(arr)Q91易塔云建站-模板下载,web开发资源,技术博客
  // 如果没有对应的路由地址,抛出错误Q91易塔云建站-模板下载,web开发资源,技术博客
  if(!arr) {Q91易塔云建站-模板下载,web开发资源,技术博客
    res.end("<h1>无页面显示</h1>")Q91易塔云建站-模板下载,web开发资源,技术博客
    return;Q91易塔云建站-模板下载,web开发资源,技术博客
  }Q91易塔云建站-模板下载,web开发资源,技术博客
  // 获取信息Q91易塔云建站-模板下载,web开发资源,技术博客
  // 正则的第一项Q91易塔云建站-模板下载,web开发资源,技术博客
  var $1 = arr[1];Q91易塔云建站-模板下载,web开发资源,技术博客
  // 正则的第二项Q91易塔云建站-模板下载,web开发资源,技术博客
  var $2 = arr[2]Q91易塔云建站-模板下载,web开发资源,技术博客
  // 数据模拟Q91易塔云建站-模板下载,web开发资源,技术博客
  var user = {Q91易塔云建站-模板下载,web开发资源,技术博客
    "zhoujielun":"周杰伦",Q91易塔云建站-模板下载,web开发资源,技术博客
    "zhangyi":"张译",Q91易塔云建站-模板下载,web开发资源,技术博客
    "wujing":"吴京",Q91易塔云建站-模板下载,web开发资源,技术博客
    "yiyangqianxi":"易烊千玺",Q91易塔云建站-模板下载,web开发资源,技术博客
  };Q91易塔云建站-模板下载,web开发资源,技术博客
  var list = {Q91易塔云建站-模板下载,web开发资源,技术博客
    "post":"文章",Q91易塔云建站-模板下载,web开发资源,技术博客
    "ask":"提问",Q91易塔云建站-模板下载,web开发资源,技术博客
    "answer":"回答",Q91易塔云建站-模板下载,web开发资源,技术博客
    "pins":"想法",Q91易塔云建站-模板下载,web开发资源,技术博客
  }Q91易塔云建站-模板下载,web开发资源,技术博客
  // 页面返回的内容Q91易塔云建站-模板下载,web开发资源,技术博客
  res.write("<h1>"+user[$1]+"你好</h1>")Q91易塔云建站-模板下载,web开发资源,技术博客
  res.end("<h2>欢迎来到"+list[$2]+"版块</h2>")Q91易塔云建站-模板下载,web开发资源,技术博客
})
我们就模拟了知乎的路由设计。Q91易塔云建站-模板下载,web开发资源,技术博客
Q91易塔云建站-模板下载,web开发资源,技术博客
Q91易塔云建站-模板下载,web开发资源,技术博客
四、顶层路由设计会遇到的问题。Q91易塔云建站-模板下载,web开发资源,技术博客
Q91易塔云建站-模板下载,web开发资源,技术博客
我们请求zhoujielun.html文件为例,路由地址是/star/zhoujielunQ91易塔云建站-模板下载,web开发资源,技术博客
页面的内容:
<!DOCTYPE html>Q91易塔云建站-模板下载,web开发资源,技术博客
<html lang="en">Q91易塔云建站-模板下载,web开发资源,技术博客
<head>Q91易塔云建站-模板下载,web开发资源,技术博客
  <meta charset="UTF-8">Q91易塔云建站-模板下载,web开发资源,技术博客
  <meta name="viewport" content="width=device-width, initial-scale=1.0">Q91易塔云建站-模板下载,web开发资源,技术博客
  <title>Document</title>Q91易塔云建站-模板下载,web开发资源,技术博客
</head>Q91易塔云建站-模板下载,web开发资源,技术博客
<body>Q91易塔云建站-模板下载,web开发资源,技术博客
  <h1>你好,我是周杰伦</h1>Q91易塔云建站-模板下载,web开发资源,技术博客
  <img src="images/zhoujinlun.jpg" alt="">Q91易塔云建站-模板下载,web开发资源,技术博客
</body>Q91易塔云建站-模板下载,web开发资源,技术博客
</html>
Q91易塔云建站-模板下载,web开发资源,技术博客
通过上图你会发现页面中只有文字的展示,没有图片的展示,但是HTML结构中是有img标签的,为什么不能加载?Q91易塔云建站-模板下载,web开发资源,技术博客
答:该图片的URL路径是没有物理文件夹的。Q91易塔云建站-模板下载,web开发资源,技术博客
现在这张图片的真实物理地址是:http://127.0.0.1:3000/star/images/zhoujielun.html,但是图片物理存放地址是在:C:\node_study\public\images,所以一定不能按需加载。Q91易塔云建站-模板下载,web开发资源,技术博客
那么解决办法就是对每一张图片进行请求设置。
var server = http.createServer(function(req,res){Q91易塔云建站-模板下载,web开发资源,技术博客
  console.log(req.url)Q91易塔云建站-模板下载,web开发资源,技术博客
  // 设置字符集Q91易塔云建站-模板下载,web开发资源,技术博客
  res.setHeader("Content-Type","text/html;charset=UTF8");Q91易塔云建站-模板下载,web开发资源,技术博客
//对页面的内容进行请求Q91易塔云建站-模板下载,web开发资源,技术博客
  if(req.url === "/star/zhoujielun") {Q91易塔云建站-模板下载,web开发资源,技术博客
    fs.readFile("./public/zhoujielun.html",function(err,data) {Q91易塔云建站-模板下载,web开发资源,技术博客
      res.end(data)Q91易塔云建站-模板下载,web开发资源,技术博客
})Q91易塔云建站-模板下载,web开发资源,技术博客
//对页面的图片地址进行请求Q91易塔云建站-模板下载,web开发资源,技术博客
  } else if(req.url=="/star/images/zhoujinlun.jpg"){Q91易塔云建站-模板下载,web开发资源,技术博客
    res.setHeader("Content-Type","image/jpg");Q91易塔云建站-模板下载,web开发资源,技术博客
    // 读取图片Q91易塔云建站-模板下载,web开发资源,技术博客
    fs.readFile("./public/images/zhoujinlun.jpg",function(err,data){Q91易塔云建站-模板下载,web开发资源,技术博客
      res.end(data)Q91易塔云建站-模板下载,web开发资源,技术博客
    })Q91易塔云建站-模板下载,web开发资源,技术博客
  }else{Q91易塔云建站-模板下载,web开发资源,技术博客
    res.end("无页面显示")Q91易塔云建站-模板下载,web开发资源,技术博客
  }Q91易塔云建站-模板下载,web开发资源,技术博客
})
Q91易塔云建站-模板下载,web开发资源,技术博客
问题来了,如果图片的数量很多怎么办?每一张都势必要进行对路由的请求和渲染,也就是要给每一张图片开辟路由地址,不仅仅是图片,其他文件也是一样的。Q91易塔云建站-模板下载,web开发资源,技术博客
解决办法就是我们后面要学习的express的中间件来静态化一个文件夹。目的就是当前这个文件夹内部的文件自动就有了URL路由,不用每个都单独设置。Q91易塔云建站-模板下载,web开发资源,技术博客
需要注意的是:使用Node.js进行请求文件或资源的时候,需要设置对应的Content-Type,就是文件的请求类型。Q91易塔云建站-模板下载,web开发资源,技术博客
常见的类型有:Q91易塔云建站-模板下载,web开发资源,技术博客
text/html:HTML格式Q91易塔云建站-模板下载,web开发资源,技术博客
text/css:CSS格式Q91易塔云建站-模板下载,web开发资源,技术博客
text/plain:纯文本格式Q91易塔云建站-模板下载,web开发资源,技术博客
text/xml:XML格式Q91易塔云建站-模板下载,web开发资源,技术博客
image/gif:GIF文件格式Q91易塔云建站-模板下载,web开发资源,技术博客
iamge/jpeg:JPEG图片格式Q91易塔云建站-模板下载,web开发资源,技术博客
image/png:PNG图片格式
res.setHeader("Content-Type","text/html;charset=UTF8") //HTMLQ91易塔云建站-模板下载,web开发资源,技术博客
res.setHeader("Content-Type"," text/css ") //CSSQ91易塔云建站-模板下载,web开发资源,技术博客
res.setHeader("Content-Type"," image/png ") //png格式的图片

评论

  • 匿名