nodejs抓取动态网页( ()函数的处理方法与对应的修改 )
优采云 发布时间: 2022-02-07 22:15nodejs抓取动态网页(
()函数的处理方法与对应的修改
)
<p>现存在如下图所示的文件目录: <br />
<br /> 我们希望通过02.js来实现能够静态加载static中的文件 <br /> 这篇博客是我的上一篇博客静态资源管理续篇,在上一篇博客中,因为遇到加载json格式的文件遇到了问题,所以写了一个续篇,如果有感兴趣的小伙伴可以看一下 <br /> 实现代码如下:var http = require('http');
var url = require('url');
var fs = require('fs');
var path = require('path');
var server = http.createServer(function (req,res) {
//这里如果不用req.url来判断,那么不管用户输入什么操作,执行的操作都是一样的
//得到地址
var pathname = url.parse(req.url).pathname;
//不处理小图标的请求
if(pathname == '/favicon.ico'){
return;
}
//判断此时用户输入的是文件地址还是文件夹地址
//如果是文件夹地址,那么自动请求这个文件夹中的index.html
if(pathname.indexOf('.') == -1){
pathname += 'index.html';
}
//得到用户输入的文件的拓展名
var extname = path.extname(pathname);
console.log(pathname);
fs.readFile('./static/'+pathname,function (err,data) {
if(err){
//如果页面报错,则让它返回一个新的页面
fs.readFile('./static/404.html',function (err,data) {
res.writeHead(200,{'Content-Type':'text/html;charset=UTF8'});
res.end(data);
})
return;
}
//读完文件之后做的事情
console.log(process.cwd());
var mime = getMime(extname);
res.writeHead(200,{'Content-Type':mime+';charset=UTF8'});
res.end(data);
})
}).listen(80,'127.0.0.1');
function getMime(extname) {
//读取mime.josn文件,得到JOSN,根据extname key ,f返回对应的value值
switch (extname){
case '.html':
return 'text/html';
break;
case '.css':
return 'text/css';
break;
case '.img':
return 'image/img';
break;
case '.json':
fs.readFile('./static/mime.json',function (err,data) {
if(err){
throw Error("找不到mime.json文件!");
return;
}
//转成JSON
console.log(typeof data);
//利用json.parse将一个josn字符串解析成为json格式
var mimeJSON = JSON.parse(data);
console.log(mimeJSON[extname]);
return mimeJSON[extname];
})
}
}</p>
当我们读取到文件的扩展名是json时,我们读取的是json格式的文件,然后使用JSON.parse()方法将JSON字符串转换为JSON对象,然后检索JSON对象。转成json扩展名对应的MIME类型。
然而,我们惊讶地发现响应头中的 content-type 类型是未定义的,
但是我们不是已经在这部分代码中写好文件类型了吗?
这是因为getMime()函数,当传入参数为'.json'时,函数执行代码中收录异步操作,即读取json文件,所以在未读取文件时,mime有还没读完。赋值时mime已写入content-type,未定义;
那我们该怎么办呢?
我们采取强制回调函数getMime的方法,传入文件的扩展名后,再执行回调函数中的内容,并将mime的值赋值给content-type,避免出现问题异步加载。
修改代码如下:
getMime(extname,function(mime){
res.writeHead(200,{'Content-Type':mime+';charset=UTF8'});
res.end(data);
})
这样,我们就可以在参数mime的值返回后,进行将type值赋给Content-type的操作。对应的getMime()函数也应该相应修改:
function getMime(extname,callback){
//读取mime的json文件,将对应扩展名的MIME类型名返回
fs.readfile('./static/mime.json',function(err,data){
if(err){
throw Error('找不到mime.json类型的文件!');
}
//将json字符串转换为json对象
var mimeJSON = JSON.parse(data);
var mime = mimeJSON[extname] || 'text/plain
';
callback(mime);
})
}