一、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/zhoujielun
Q91易塔云建站-模板下载,web开发资源,技术博客
Q91易塔云建站-模板下载,web开发资源,技术博客再比如我们要访问/star/wanglihong
Q91易塔云建站-模板下载,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/zhoujielun
Q91易塔云建站-模板下载,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格式的图片