nodejs异步回调形成的困扰

现存在以下图所示的文件目录:
这里写图片描述
咱们但愿经过02.js来实现可以静态加载static中的文件
这篇博客是个人上一篇博客静态资源管理续篇,在上一篇博客中,由于遇到加载json格式的文件遇到了问题,因此写了一个续篇,若是有感兴趣的小伙伴能够看一下
实现代码以下:javascript

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];
          })
   }
}

当咱们读取到文件的扩展名为json时,咱们读取这个json格式的文件,而后利用JSON.parse()的方法将JSON字符串转化为JSON对象,而后在这个JSON对象中取到对应json扩展名的MIME类型。
但是,咱们却惊讶的发现响应头中的content-type类型是undefined,
这里写图片描述
但是咱们不是已经在代码的这个地方书写了文件类型吗?
这里写图片描述
这是由于getMime()函数,当其中传入的参数为‘.json’,函数执行代码包含异步操做,即读取这个json文件,因此,当文件还未读取完毕,mime还未赋值时,mime就已经被写入content-type中,也就是undefined;
那咱们该怎么作?
咱们采起给getMime强行加一个回调函数,当传入文件的拓展名以后再执行回调函数中的内容,将mime的值赋给content-type,这样就能够避免异步加载的问题。
现将代码修改以下:php

getMime(extname,function(mime){
      res.writeHead(200,{'Content-Type':mime+';charset=UTF8'});
      res.end(data);
})

这样等到参数mime的值返回以后咱们才能执行将类型值赋给Content-type的操做。对应的getMime()函数也要进行对应修改:css

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);
 })
}