ThoughtWorks西邮联合创新实验室

关于异步操作

2018-05-19  本文已影响13人  Gaarahan

刚开始接触NodeJs便多次听到它是 单线程异步非阻塞IO模型 ,虽然看过好多例子,然而还是不怎么理解,借着一个BUG整理下思路。


问题

var backHeader = {
  'html' : {
    'content-type' : 'text/html',
    'charset':'utf8'
  },
  'css' : {
    'content-type' : 'text/css',
    'charset':'utf8'
  },
  'pic' : {
    'content-type' : 'image/jpeg',
    'charset':'utf8'
  },
  'js' : {
    'content-type' : 'application/x-javascript',
    'charset':'utf8'
  }
}

    ......
//对应不同的请求后缀名,给予不同的响应报文头
    var staticHead = "";

    if(url.endsWith('.jpg') || url.endsWith('.jpeg'))
      staticHead = backHeader['pic'];
    else if( url.endsWith('.css') ){
      staticHead = backHeader['css'];
    }
    else if(url.endsWith('.js')){
      staticHead = backHeader['js'];
    }
    else if(url.endsWith('.html')){
      staticHead = backHeader['html'];
    }
//读取请求的文件,并写入对应的报文头
    fs.readFile(file,function(err,data){
      if(err){
        ......
      }
      else{
        console.log(staticHead); //调试时加入的代码
        res.writeHeader(200,staticHead);
        res.write(data);
        res.end();
      }
    });

原因

分析这段代码的工作方式:

  • 分析传入的URL,并将对应的响应报文头存储到变量staticHead中
  • 读取URL请求的文件
  • 文件读取完毕后输出对应的响应报文头(调试代码)
  • 将读出来的文件内容写入到响应报文体中
  • 将响应报文发给浏览器来解析
虽然每个文件的响应报文头是没问题的,但存储响应报文头的变量staticHead只有一个, 这就是问题的所在:

解决

上一篇 下一篇

猜你喜欢

热点阅读