nodejs抓取动态网页( ()函数的处理方法与对应的修改 )

优采云 发布时间: 2022-02-07 22:15

  nodejs抓取动态网页(

()函数的处理方法与对应的修改

)

  <p>现存在如下图所示的文件目录: <br />

<br /> 我们希望通过02.js来实现能够静态加载static中的文件 <br /> 这篇博客是我的上一篇博客静态资源管理续篇,在上一篇博客中,因为遇到加载json格式的文件遇到了问题,所以写了一个续篇,如果有感兴趣的小伙伴可以看一下 <br /> 实现代码如下:

var http = require(&#39;http&#39;);

var url = require(&#39;url&#39;);

var fs = require(&#39;fs&#39;);

var path = require(&#39;path&#39;);

var server = http.createServer(function (req,res) {

//这里如果不用req.url来判断,那么不管用户输入什么操作,执行的操作都是一样的

//得到地址

var pathname = url.parse(req.url).pathname;

//不处理小图标的请求

if(pathname == &#39;/favicon.ico&#39;){

return;

}

//判断此时用户输入的是文件地址还是文件夹地址

//如果是文件夹地址,那么自动请求这个文件夹中的index.html

if(pathname.indexOf(&#39;.&#39;) == -1){

pathname += &#39;index.html&#39;;

}

//得到用户输入的文件的拓展名

var extname = path.extname(pathname);

console.log(pathname);

fs.readFile(&#39;./static/&#39;+pathname,function (err,data) {

if(err){

//如果页面报错,则让它返回一个新的页面

fs.readFile(&#39;./static/404.html&#39;,function (err,data) {

res.writeHead(200,{&#39;Content-Type&#39;:&#39;text/html;charset=UTF8&#39;});

res.end(data);

})

return;

}

//读完文件之后做的事情

console.log(process.cwd());

var mime = getMime(extname);

res.writeHead(200,{&#39;Content-Type&#39;:mime+&#39;;charset=UTF8&#39;});

res.end(data);

})

}).listen(80,&#39;127.0.0.1&#39;);

function getMime(extname) {

//读取mime.josn文件,得到JOSN,根据extname key ,f返回对应的value值

switch (extname){

case &#39;.html&#39;:

return &#39;text/html&#39;;

break;

case &#39;.css&#39;:

return &#39;text/css&#39;;

break;

case &#39;.img&#39;:

return &#39;image/img&#39;;

break;

case &#39;.json&#39;:

fs.readFile(&#39;./static/mime.json&#39;,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,{&#39;Content-Type&#39;:mime+&#39;;charset=UTF8&#39;});

res.end(data);

})

  这样,我们就可以在参数mime的值返回后,进行将type值赋给Content-type的操作。对应的getMime()函数也应该相应修改:

  function getMime(extname,callback){

//读取mime的json文件,将对应扩展名的MIME类型名返回

fs.readfile(&#39;./static/mime.json&#39;,function(err,data){

if(err){

throw Error(&#39;找不到mime.json类型的文件!&#39;);

}

//将json字符串转换为json对象

var mimeJSON = JSON.parse(data);

var mime = mimeJSON[extname] || &#39;text/plain

&#39;;

callback(mime);

})

}

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线