Node.js入门笔记(5):HTTP服务

187 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

HTTP模块是Node的核心模块,提供了一些网络传输的API,API位于比较底层的位置,开发中我们可以用这些API控制HTTP传输过程。Node定义了一些顶级的类、属性以及方法供我们使用image.png

创建HTTP服务器

我们通过createServer方法创建HTTP服务器 当浏览器访问localhost:3000时,Node返回“Hello Node”字符串。

var http = require ( "http" )
var server = http.createServer (function (req, res){
    res.writeHead (200,{ 'content-Type' : 'text/plain ' } ) ;
    res.end ( "Hello Node ! " )
} ) ;

server.listen(3000) 

image.png

我们开启了一个简单的HTTP服务器并且返回了一个server实例,俩个参数req,res分别代表我们平时请求的request和回调的response,server创建之后,我们通过listen来监听一个端口。服务器创建完成后,Node进程开始循环监听3000端口

var http = require ( "http" )
var server = http.createServer (function (req, res){
    res.writeHead (200,{ 'content-Type' : 'text/plain ' } ) ;
    res.end ( "Hello Node ! " )
} ) ;

server.on ( "connection" ,function (req,res){
    console.log('connected');
    
})
server.on ( "request" ,function (req,res){
    console.log('request');
    
})
server.listen(3000) 

开发中我们需要判断服务器的一些基本活动情况,我们可以通过on来对server增加监听时间,现在以监听连接服务和请求为例子,当我们访问3000端口的时候,我们的控制台会打印出连接的状态

image.png

connected表示连接成功,request表示请求,这里有俩次request是因为我们需要获取到页面的favicon资源,所以也需要一次请求。

创建一个简单的服务器

var http = require ( "http" )
var fs = require ( "fs" )
var server = http.createServer (function (req, res){
    // res.writeHead (200,{ 'content-Type' : 'text/plain ' } ) ;
    // res.end ( "Hello Node ! " )
    if(req.url=='/'){
        let fileList =fs.readdirSync("./");
        res.writeHead (200,{'Content-type': 'text/plain'} ) ;
        res.end(fileList.toString("utf-8"))
    }else{
        let path = req.url
        fs.readFile("."+path,function(err,data){
            if(err){
                res.end("err")
                // throw err
            }
            res.writeHead(200,{"Content-type":"text/plain"})
            res.end(data.toString("utf-8"))
        })
    }
} ) ;
server.listen(3000) 
console.log('3000');

通过一个小实例我们就可以访问到我们的目录下面的所有文件了,其实我们这里访问的路径是localhost:3000/,所以进入的是第一个判断,第二个判断fs.readFile("."+path,function(err,data)用"."的原因是避免在linnux下面访问到根目录

image.png

The chunk argument must be of type string or an instance of Buffer or Uint8Array

然后开发的时候出现了一个报错,这里是由于发送的res.end必须是字符串导致的,所以res.end(fileList.toString("utf-8"))这些一定要打对才行

处理HTTP请求

获取方法

req.method

对于HTTP请求来说,method的值get和post最常见,我们通过req.method来进行获取

image.png

获取请求头

let headers = req.headers
let userAgent = headers['user-agent']