• 05 【nodejs内置模块(上)】


    05 【nodejs内置模块(上)】

    1.nodejs 的官方API文档

    • Node.js 的API文档(英文): https://nodejs.org/docs/latest-v8.x/api/index.html
    • Node.js 的API文档(中文):http://nodejs.cn/api/

    关于 Node.js 的内置模块和常见API,可以看官方文档。

    查阅文档时,稳定指数如下:

    • 红色:废弃。
    • 橙色:实验。表示当前版本可用,其他版本不确定。也许不向下兼容,建议不要在生产环境中使用该特性。
    • 绿色:稳定。与 npm 生态系统的兼容性是最高的优先级。

    2.nodejs 中模块的分类

    Node.js 应用由模块组成,采用 CommonJS 模块规范。Node.js中的模块分为三种:

    • 内置模块
    • 第三方模块
    • 自定义模块

    下面简单介绍一下。

    2.1 内置模块

    const process = require('process');
    const path = require('path');
    
    console.log(process.version);
    console.log(path.resolve('../'));
    
    • 1
    • 2
    • 3
    • 4
    • 5

    require方法用于加载模块。

    常见的内置模块包括:

    • FS:文件系统模块
    • path:路径模块
    • OS:操作系统相关
    • net:网络相关
    • http

    你可能会有疑问:Node.js 这么牛吗?还能直接和操作系统做交互?

    带着这个疑问,我们不妨简单看看 Node.js 的源码,以 os 模块举例:

    • 打开os模块的源码:https://github.com/nodejs/node/blob/master/lib/os.js,翻到最底部,找到 cpus这个方法
    • 进而找到 getCPUs()
    • internalBinding(‘os’):通过 internalBinding 可以调用系统底层的方法。internalBinding 主要是 JS 虚拟机在做的事情。
    • internalBinding('os') 的实现,在 https://github.com/nodejs/node/blob/master/src/node_os.cc 里,里面都是 C++ 的代码。比如有一个getCPUs方法。

    现在你知道了,JS本身是没有能力获取底层系统资源的,这一切都是 JS虚拟机在和底层做交互,然后通过 JS 的表现形式,暴露给应用层。

    另外,还有很多库,是直接使用C/++编写的,通过编译之后,再提供给 JS 应用层调用,或者直接提供给 Node.js层使用。

    所有的编程语言底层都会回归C/C++,甚至是汇编语言

    2.2 require 加载第三方包的机制

    const express = require('express');
    
    • 1

    require 加载第三方包的机制:

    (1)第三方包安装好后,这个包一般会存放在当前项目的 node_modules 文件夹中。我们找到这个包的 package.json 文件,并且找到里面的main属性对应的入口模块,这个入口模块就是这个包的入口文件。

    (2)如果第三方包中没有找到package.json文件,或者package.json文件中没有main属性,则默认加载第三方包中的index.js文件。

    (3)如果在 node_modules 文件夹中没有找到这个包,或者以上所有情况都没有找到,则会向上一级父级目录下查找node_modules文件夹,查找规则如上一致。

    (4)如果一直找到该模块的磁盘根路径都没有找到,则会报错:can not find module xxx。

    2.3 自定义模块(module)

    每个文件就是一个模块,有自己的作用域。在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见。

    举例:

    var example = require('./example.js');
    console.log(example.x); // 5
    console.log(example.addX(1)); // 6
    
    • 1
    • 2
    • 3

    3.网络服务 http

    3.1 http模块概览

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

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

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

    3.2 一个简单的例子

    在下面的例子中,我们创建了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);
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    3.3 例子解释

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

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

    3.4 关于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)

    4.网络服务 http res

    4.1 概览

    http模块四剑客之一的res,应该都不陌生了。一个web服务程序,接受到来自客户端的http请求后,向客户端返回正确的响应内容,这就是res的职责。

    返回的内容包括:状态代码/状态描述信息、响应头部、响应主体。下文会举几个简单的例子。

    var http = require('http');
    var server = http.createServer(function(req, res){
       
        res.end('ok');
    });
    server.listen(3000);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.2 例子

    在下面的例子中,我们同时设置了 状态代码/状态描述信息、响应头部、响应主体,就是这么简单。

    var http = require('http');
    
    // 设置状态码、状态描述信息、响应主体
    var server = http.createServer(function(req, res){
       
        res.writeHead(200, 'ok', {
       
            'Content-Type': 'text/plain'
        });
        res.end('hello');
    });
    
    server.listen(3000);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4.3 设置状态代码、状态描述信息

    res提供了 res.writeHead()、res.statusCode/res.statusMessage 来实现这个目的。

    举例,如果想要设置 200/ok ,可以

    res.writeHead(200, 'ok');
    
    • 1

    也可以

    res.statusCode = 200;
    res.statusMessage = 'ok';
    
    • 1
    • 2

    两者差不多,差异点在于

    1. res.writeHead() 可以提供额外的功能,比如设置响应头部。
    2. 当响应头部发送出去后,res.statusCode/res.statusMessage 会被设置成已发送出去的 状态代码/状态描述信息。

    4.4 设置响应头部

    res提供了 res.writeHead()、response.setHeader() 来实现响应头部的设置。

    举例,比如想把 Content-Type 设置为 text-plain,那么可以

    // 方法一
    res.writeHead(200, 'ok', {
       
        'Content-Type': 'text-plain'
    });
    
    // 方法二
    res.setHeader('Content-Type', 'text-plain');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    两者的差异点在哪里呢?

    1. res.writeHead() 不单单是设置header。
    2. 已经通过 res.setHeader() 设置了header,当通过 res.writeHead() 设置同名header,res.writeHead() 的设置会覆盖之前的设置。

    关于第2点差异,这里举个例子。下面代码,最终的 Content-Typetext/plain

    var http = require('http');
    
    var server = http.createServer(function(req, res){
       
        res.setHeader('Content-Type', 'text/html');
        res.writeHead(200, 'ok', {
       
            'Content-Type': 'text/plain'
        });
        res.end('hello'<
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    工业级远距离无线传输装置的功能有哪些?
    鼓楼夜市管理wpf+sqlserver
    Codeforces Round #824 (Div. 2)
    交换机和路由器技术-22-OSPF动态路由协议
    “高校”行业智能运维解决方案解析(含落地实践)
    3D模型渲染引擎6大特点解读:助力AR/VR呈现惊叹的视觉效果!
    js里的async/await
    Java 程序的构造与执行
    c# lock作用及缺点
    Git教程-Git的基本使用
  • 原文地址:https://blog.csdn.net/DSelegent/article/details/127819459