NodeJS学习_HTTP

2019-02-28

本内容参考《Node In Action》

Node HTTP

本节主要包括Node本身的HTTP和TCP服务器。

Node底层的HTTP解析器是非常底层、非常灵活的,由1500行C代码写成的。

使用Node的底层HTTP方法是:

var http = require('http');
var server = http.createServer(function(req,res){
    //服务器每收到一条http请求,都会用req和res调用回调函数
    //服务器会对req请求做基本的解析
    //用res.end()结束响应,否则请求挂起
    
    //每解析并读入数据,会触发data事件,
    //传入一个二进制buffer,类型相当于字符串
    req.on('data',(chunk)=>{
        console.log('parsed',chunck);
    });
    
    //数据全部读取完毕会触发end事件
    req.on('end',()=>{
        console.log('end!')
    });
})
server.listen(3000);
//监听一个端口

RESTful API

对不同的Method做出反应的方法主要是:

var server = http.createServer(function (req,res) {
  switch(req.method){
      case 'GET':
        //...
        res.end();
      	break;
  }
}

静态服务器

使用Node特有的流式IO编写高效静态文件服务器的要点:

  • __dirname是Node定义的一个神奇的变量,值是文件所在目录的路径,对于创建静态文件服务器很有用。

  • fs.ReadStream是高效流式硬盘访问的类,是高效读取静态文件的重要方式,读取文件时emit出data事件,结束读取时emit出end事件。

  • 使用pipe可以进行流式编程

    ReadbleStream.pipe(WriteableStream)
    
    var readStream = fs.createReadStream('./ original. txt') 
    var writeStream = fs.createWriteStream('./ copy. txt') 
    readStream.pipe(writeStream);
    
  • 对所有流式对象,都有error事件,加上回调以处理,使服务器更加健壮。

HTTPS

使用https模块创建https链接,代码基本相同,只是在创建服务器时加入https配置:

var https = require('https');
var fs = require('fs');

//证书和密钥
var options = {
  key:fs.readFileSync('./key.pem'),
  cert:fs.readFileSync("./key-cert.pem")
};

https.createServer(options, (req,res)=>{
  res.writeHead(200);
  res.end("hello world\n");
}).listen(3000);