Node进阶:核心模块http简介

本文摘录自《Nodejs学习笔记》,更多章节及更新,请访问 github主页地址

http模块概览

大多数nodejs开发者都是冲着开发web server的目的选择了nodejs。正如官网所展示的,借助http模块,可以几行代码就搞定一个超迷你的web server。

在nodejs中,http可以说是最核心的模块,同时也是比较复杂的一个模块。上手很简单,但一旦深入学习,不少初学者就会觉得头疼,不知从何入手。

本文先从一个简单的例子出发,引出http模块最核心的四个实例。看完本文,应该就能够对http模块有个整体的认识。

一个简单的例子

在下面的例子中,我们创建了1个web服务器、1个http客户端

  • 服务器server:接收来自客户端的请求,并将客户端请求的地址返回给客户端。
  • 客户端client:向服务器发起请求,并将服务器返回的内容打印到控制台。

代码如下所示,只有几行,但包含了不少信息量。下一小节会进行简单介绍。

var http = require('http');

// http server 例子
var server = http.createServer(function(serverReq, serverRes){
    var url = serverReq.url;
    serverRes.end( '您访问的地址是:' + url );
});

server.listen(3000);

// http client 例子
var client = http.get('http://127.0.0.1:3000', function(clientRes){
    clientRes.pipe(process.stdout);
});

例子解释

在上面这个简单的例子里,涉及了4个实例。大部分时候,serverReq、serverRes 才是主角。

  • server:http.Server实例,用来提供服务,处理客户端的请求。
  • client:http.ClientReques实例,用来向服务端发起请求。
  • serverReq/clientRes:其实都是 http.IncomingMessage实。serverReq 用来获取客户端请求的相关信息,如request header;而clientRes用来获取服务端返回的相关信息,比如response header。
  • serverRes:http.ServerResponse实例

关于http.IncomingMessage、http.ServerResponse

先讲下 http.ServerResponse 实例。作用很明确,服务端通过http.ServerResponse 实例,来个请求方发送数据。包括发送响应表头,发送响应主体等。

接下来是 http.IncomingMessage 实例,由于在 server、client 都出现了,初学者难免有点迷茫。它的作用是

在server端:获取请求发送方的信息,比如请求方法、路径、传递的数据等。
在client端:获取 server 端发送过来的信息,比如请求方法、路径、传递的数据等。

http.IncomingMessage实例 有三个属性需要注意:method、statusCode、statusMessage。

  • method:只在 server 端的实例有(也就是 serverReq.method)
  • statusCode/statusMessage:只在 client 端 的实例有(也就是 clientRes.method)

关于继承与扩展

http.Server

  • http.Server 继承了 net.Server (于是顺带需要学一下 net.Server 的API、属性、相关事件)
  • net.createServer(fn),回调中的 socket 是个双工的stream接口,也就是说,读取发送方信息、向发送方发送信息都靠他。

备注:socket的客户端、服务端是相对的概念,所以其实 net.Server 内部也是用了 net.Socket(不负责任猜想)

// 参考:https://cnodejs.org/topic/4fb1c1fd1975fe1e1310490b
var net = require('net');

var PORT = 8989;
var HOST = '127.0.0.1';

var server = net.createServer(function(socket){
    console.log('Connected: ' + socket.remoteAddress + ':' + socket.remotePort);

    socket.on('data', function(data){
        console.log('DATA ' + socket.remoteAddress + ': ' + data);
        console.log('Data is: ' + data);

        socket.write('Data from you is  "' + data + '"');
    });

    socket.on('close', function(){
         console.log('CLOSED: ' +
            socket.remoteAddress + ' ' + socket.remotePort);
    });
});
server.listen(PORT, HOST);

console.log(server instanceof net.Server);  // true

http.ClientRequest

http.ClientRequest 内部创建了一个socket来发起请求,代码如下

当你调用 http.request(options) 时,内部是这样的

self.onSocket(net.createConnection(options));

http.ServerResponse

  • 实现了 Writable Stream interface,内部也是通过socket来发送信息。

http.IncomingMessage

  • 实现了 Readable Stream interface,参考这里
  • req.socket --> 获得跟这次连接相关的socket
时间: 2024-09-12 11:47:38

Node进阶:核心模块http简介的相关文章

Nodejs进阶:核心模块Buffer常用API使用总结

本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. 模块概览 Buffer是node的核心模块,开发者可以利用它来处理二进制数据,比如文件流的读写.网络请求数据的处理等. Buffer的API非常多,本文仅挑选 比较常用/容易理解 的API进行讲解,包括Buffer实例的创建.比较.连接.拷贝.查找.遍历.类型转换.截取.编码转换等. 创建 new Buffer(array) Buffer.alloc(length) Bu

Nodejs进阶:核心模块net入门与实例讲解

本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址. 模块概览 net模块是同样是nodejs的核心模块.在http模块概览里提到,http.Server继承了net.Server,此外,http客户端与http服务端的通信均依赖于socket(net.Socket).也就是说,做node服务端编程,net基本是绕不开的一个模块. 从组成来看,net模块主要包含两部分,了解socket编程的同学应该比较熟悉了: net.Server:TCP server,内部通过

Nodejs进阶:核心模块net入门学习与实例讲解_node.js

模块概览 net模块是同样是nodejs的核心模块.在http模块概览里提到,http.Server继承了net.Server,此外,http客户端与http服务端的通信均依赖于socket(net.Socket).也就是说,做node服务端编程,net基本是绕不开的一个模块. 从组成来看,net模块主要包含两部分,了解socket编程的同学应该比较熟悉了: net.Server:TCP server,内部通过socket来实现与客户端的通信. net.Socket:tcp/本地 socket的

向Node.js核心贡献代码的六个步骤

本文的目的是帮助您完成向 Node.js 核心文件贡献代码的第一个提交! 向 Node.js 贡献代码的方式有很多种.可以参与某个工作组(网站或者联机诊断工作组等)的工作,可以在 Nodeschools 开设课程提供 Node.js 的教学, 让那些有着同样困惑的人可以向你学习. 当然你也可以开始直接向 Node.js 的核心贡献,比如回答使用者的问题,甚至向项目提交代码. 接下来,我们介绍提交代码以获取乐趣和成就感的必要步骤. # 1 Fork 项目 请访问位于 https://github.

nodejs的require模块(文件模块/核心模块)及路径介绍_基础知识

在nodejs中,模块大概可以分为核心模块和文件模块. 核心模块是被编译成二进制代码,引用的时候只需require表示符即可,如(require('net')). 文件模块,则是指js文件.json文件或者是.node文件.在引用文件模块的时候后要加上文件的路径:/.../.../xxx.js表示绝对路径../xxx.js表示相对路径(同一文件夹下的xxx.js),../表示上一级目录.如果既不加/.../.../又不加./的话,则该模块要么是核心模块,要么是从一个node_modules文件夹

我国物联网星座核心模块开展在轨验证

2017年11月15日,北京国电高科科技有限公司研制的UHF频段DCS(Data Collecting System)载荷模块在太原发射场搭载CZ-4C运载火箭发射入轨,开展在轨试验,本次试验任务对公司全球物联网星座布局具有重要意义. DCS载荷是开展物联网星座应用的核心模块,其本质上是一种天基短报文通信系统,用于接收分散于全球的各类终端上行数据,存储并转发至地面数据中心,还可提供下行业务信息广播,进而实现对地面终端管控. DCS载荷入轨后,经过必要检测,将开展多项试验,包括: 1.天地接口对接

项目管理如何把核心模块隔离

问题描述 项目管理如何把核心模块隔离 项目管理如何将核心层隔离,分层开发代码SVN同步核心层不暴露源代码?如何解决 解决方案 要看你用的语言和开发工具了,把核心模块编译成可执行的库/包,让外层能调用就可以了. 解决方案二: 核心层编译好之后,再供调用

《深入理解Nginx:模块开发与架构解析》一2.4 用HTTP核心模块配置一个静态Web服务器

2.4 用HTTP核心模块配置一个静态Web服务器 静态Web服务器的主要功能由ngx_http_core_module模块(HTTP框架的主要成员)实现,当然,一个完整的静态Web服务器还有许多功能是由其他的HTTP模块实现的.本节主要讨论如何配置一个包含基本功能的静态Web服务器,文中会完整地说明ngx_http_core_module模块提供的配置项及变量的用法,但不会过多说明其他HTTP模块的配置项.在阅读完本节内容后,读者应当可以通过简单的查询相关模块(如ngx_http_gzip_f

Hadoop2源码分析-HDFS核心模块分析

1.概述 这篇博客接着<Hadoop2源码分析-RPC机制初识> 来讲述,前面我们对MapReduce.序列化.RPC进行了分析和探索,对Hadoop V2的这些模块都有了大致的了解,通过对这些模块的研究,我们明白了MapReduce的运行流程以及内部的实现机制,Hadoop的序列化以及它的通信 机制(RPC).今天我们来研究另一个核心的模块,那就是Hadoop的分布式文件存储系统--HDFS,下面是今天分享的内容目录: HDFS简述 NameNode DataNode 接下来,我们开始今天的