Node.js学习笔记(五) http模块

简介: Node.js学习笔记(五) http模块

前言


这篇文章我们将会学习 Node 的内置模块 http,http 模块主要用于 搭建 HTTP 服务端和客户端


正文


1、http 服务端

(1)创建服务

http 服务端通过 http.Server 实现,我们可以通过以下两种方法创建一个 http.Server

const http = require('http')
// 方法一
var server = new http.Server()
// 方法二
var server = http.createServer()


(2)绑定事件

http.Server 是一个 基于事件 的服务器,我们需要为不同的事件指定相应的处理函数,即可完成功能

最常用的事件莫过于 request,当服务器获取到请求时,就会触发该事件

事件处理函数接收两个参数,分别对应 http.IncomingMessagehttp.ServerResponse

server.on('request', function(message, response) {
    console.log(message instanceof http.IncomingMessage) // true
    console.log(response instanceof http.ServerResponse) // true
    console.log('收到请求')
})


(3)属性方法


http.Server 还有一些常用的属性和方法,介绍如下:


  • listen():监听连接
  • close():关闭连接
  • setTimeout():设置超时时间
  • listening:是否正在监听连接
  • maxHeadersCount:传入的最大报头数,默认为 2000
  • timeout:套接字超时前的等待时间,默认为 0 ms
  • headersTimeout:接收到完整报头前的等待时间,默认为 60000 ms
  • keepAliveTimeout:在写入最后一个响应之后且在套接字销毁之前的等待时间,默认为 5000 ms
server.listen(8888, '127.0.0.1', function() {
    console.log('server running at http://127.0.0.1:8888')
})


(4)http.IncomingMessagehttp.ServerResponse


http.IncomingMessage 表示接收到的数据对象,常用的属性和方法如下:

属性和方法 描述
aborted 请求是否已经终止
complete 是否已接收到完整信息并成功解析
rawHeaders 原始请求头列表
headers 请求头对象
url URL 字符串
httpVersion HTTP 版本
method 请求方法
statusCode 状态代码
statusMessage 状态信息


http.ServerResponse 表示要发送的响应对象,常用的属性和方法如下:

属性和方法 描述
hasHeader(name) 是否具有特定的响应头
getHeader(name) 获取指定的响应头
getHeaders() 获取所有响应头
getHeaderNames() 获取所有响应头的名称
setHeader(name, value) 设置响应头
removeHeader(name) 删除响应头
setTimeout(msecs[, callback]) 设置超时时间
writeHead(statusCode[, statusMessage][, headers]) 发送响应头
write(chunk[, encoding][, callback]) 发送响应体
ata[, encoding]][, callback]) 所有数据已经发送完毕
headersSent 是否已经发送响应头
statusCode 状态代码,默认为 200
statusMessage 状态信息,默认使用状态代码的标准信息


(5)一个完整的例子

// server.js
const http = require('http')
const path = require('path')
const fs = require('fs')
const server = http.createServer()
server.on('request', function(message, response) {
    let url = message.url
    if (url === '/') url = '/index.html'
    fs.readFile(path.join(__dirname, url), function(error, data) {
        if (error) {
            response.writeHead(404, {'Content-Type': 'plain/html'})
        }
        else {
            response.writeHead(200, {'Content-Type': 'text/html'})
            response.write(data)
        }
        response.end()
    })
})
server.listen(8888, '127.0.0.1', function() {
    console.log('server running at http://127.0.0.1:8888')
})

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Index</title>
</head>
<body>
    <p>Index Page</p>
</body>
</html>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>About</title>
</head>
<body>
    <p>About Page</p>
</body>
</html>


2、http 客户端


(1)创建服务


http 客户端用于发送 HTTP 请求,它是基于 http.request 实现的,创建方法的签名如下:


http 客户端用于发送 HTTP 请求,它是基于 http.request 实现的,创建方法的签名如下:

http.request(options[, callback])
http.request(url[, options][, callback])


  • url:请求地址,类型为 string 或 URL
  • options:请求参数,类型为 object,常用的属性如下:

headers<object>:请求头

maxHeaderSize<number>:请求头的最大长度,默认为 8192 Bytes

method<string>:请求方法,默认为 GET

protocol<string>:网络协议,默认为 http:

host<string>:请求的域名或者 IP 地址,默认为 localhost

hostname<string>:host 的别名,并且 hostname 的优先级高于 host

port<number>:请求端口,默认如果有设置 defaultPort,则为 defaultPort,否则为 80

path<string>:请求路径,默认为 /

timeout<number>:超时时间


  • callback:回调函数
const http = require('http')
let url = 'http://127.0.0.1:8888/index.html'
let request = http.request(url)

http.request 方法返回 http.ClientRequest 对象


(2)绑定事件


http.ClientRequest 对象也是基于事件的,常用的事件如下:

  • 如果请求发送成功,那么依次触发以下事件:socket -> response(data -> end) -> close
  • 如果请求发送失败,那么依次触发以下事件:socket -> error -> close
request.on('response', function(message) {
    console.log(message instanceof http.IncomingMessage) // true
    console.log('收到响应')
})
request.on('error', function(error) {
    console.log(error instanceof Error) // true
    console.log('发生错误')
})


(3)属性方法


http.ClientRequest 对象常用的属性和方法如下:

  • abort():标志请求被终止
  • getHeader(name):获取请求头
  • setHeader(name, value):设置请求头
  • removeHeader(name):删除请求头
  • setTimeout(timeout[, callback]):设置超时时间
  • write(chunk[, encoding][, callback]):发送请求体
  • end([data[, encoding]][, callback]):所有数据已经发送完毕


// 发送数据
const querystring = require('querystring')
request.write(querystring.stringify({
    username: 'wsmrzx',
    password: '123456'
}))
// 发送结束标志
request.end()

(4)一个完整的例子

const http = require('http')
let url = 'http://127.0.0.1:8888/index.html'
let request = http.request(url)
request.on('response', function(message) {
    let html = ''
    message.on('data', function(chunk) {
        html += chunk
    })
    message.on('end', function() {
        console.log(html)
    })
})
request.on('error', function(error) {
    console.log(error.message)
})
request.end()

文章知识点与官方知识档案匹配,可进一步学习相关知识

目录
相关文章
|
1月前
|
缓存 JavaScript 安全
nodejs里面的http模块介绍和使用
综上所述,Node.js的http模块是构建Web服务的基础,其灵活性和强大功能,结合Node.js异步非阻塞的特点,为现代Web应用开发提供了坚实的基础。
102 62
|
2月前
|
JavaScript 前端开发
Vue、ElementUI配合Node、multiparty模块实现图片上传并反显_小demo
如何使用Vue和Element UI配合Node.js及multiparty模块实现图片上传并反显的功能,包括前端的Element UI组件配置和后端的Node.js服务端代码实现。
34 1
Vue、ElementUI配合Node、multiparty模块实现图片上传并反显_小demo
|
1月前
|
缓存 JSON JavaScript
Node.js模块系统
10月更文挑战第4天
37 2
|
2月前
|
Prometheus 监控 Cloud Native
prometheus学习笔记之node-export
prometheus 监控 node-exporter
|
2月前
|
前端开发 JavaScript
node反向代理,解决跨域(http-proxy-middleware)
使用node.js和http-proxy-middleware库实现反向代理,解决跨域问题,允许前端请求通过代理访问不同端口的服务。
102 3
|
1月前
|
JavaScript 应用服务中间件 Apache
Node.js Web 模块
10月更文挑战第7天
30 0
|
1月前
|
JavaScript 网络协议
Node.js 工具模块
10月更文挑战第7天
20 0
|
1月前
|
JavaScript 前端开发 应用服务中间件
Node.js Web 模块
Node.js Web 模块
|
2月前
Nest.js 实战 (十二):优雅地使用事件发布/订阅模块 Event Emitter
这篇文章介绍了在Nest.js构建应用时,如何通过事件/发布-订阅模式使应用程序更健壮、灵活、易于扩展,并简化服务间通信。文章主要围绕@nestjs/event-emitter模块展开,这是一个基于eventemitter2库的社区模块,提供了事件发布/订阅功能,使得实现事件驱动架构变得简单。文章还介绍了如何使用该模块,包括安装依赖、初始化模块、注册EventEmitterModule、使用装饰器简化监听等。最后总结,集成@nestjs/event-emitter模块可以提升应用程序的事件驱动能力,构建出更为松耦合、易扩展且高度灵活的系统架构,是构建现代、响应迅速且具有高度解耦特性的Nest.
|
2月前
|
缓存 JavaScript 前端开发
JavaScript模块化开发:ES6模块与CommonJs的对比与应用
JavaScript模块化开发:ES6模块与CommonJs的对比与应用
32 2

热门文章

最新文章