• Node.js API 初解读(三)


    Node.JS API 初解读三

    Version: NodeJs v6.2.0
    

    一、 DNS (Domain Name Server) [域名服务器]

    1、简介

    node 的 DNS 模块包含了二种类型的 函数, 一种是 利用底层操作系统来查询域名,而且不需要使用任何的网络通信。这种类型的只有一个函数(dns.lookup)
    另外一种就是 连接到一个实际的DNS服务器进行名称解析。 这种类型的函数的 除了 (dns.lookup) 剩下的都是。

    2、函数

    dns.lookup( hostname[,options],callback)
    dns.resolve4(hostname, callback) [域名解析]
    dns.resolve6(hostname, callback)
    剩下的还有什么 A类解析,CNAME 解析 等等

    3、例子

    const dns = require('dns');
    
    // console.log(dns)
    
    dns.lookup('vuejs.com.cn', (err, addresses, family) => {
        console.log('addresses1:', addresses)        // 58.64.156.143
    });
    
    const options = {
        all: true,
        family: 4,  // 4 or 6  ipv4 or ipv6
        // hints  
    }
    
    dns.lookup('vuejs.com.cn', options, (err, addresses, family) => {
        console.log('addresses1:', addresses)        //  [ { address: '58.64.156.143', family: 4 } ]
    });
    
    
    // 域名解析
    dns.resolve4('vuejs.com.cn', (err, addresses) => {
    
        if (err) throw err;
    
        console.log('addresses2:', JSON.stringify(addresses));
        console.log(`addresses3: ${JSON.stringify(addresses)}`);
    });
    
    
    // 那么 lookup  和 resolve4 有什么区别呢?
    // 
    // 其实本质上没什么区别, 唯一的区别就是 在 是否有本地HOST 文件
    // 比如我 在本地 host 文件中将 vuejs.com.cn    127.0.0.1
    
    // 那么我们再去试试这个 lookup  和 resolve4
    // 我们会发现  由于 lookup 是底层操作系统来查询的,并且不链接网络,所以最多就查询到 本地 host (当本地host存在的时候)
    // 但是 resolve4却不一样
    // 
    // lookup  --- 127.0.0.1
    // resolve4 -- 58.64.156.143
    

    4、运行例子

    node dns.js
    -------------------------------
    addresses2: ["58.64.156.143"]
    addresses3: ["58.64.156.143"]
    addresses1: [ { address: '58.64.156.143', family: 4 } ]
    addresses1: 58.64.156.143
    -------------------------------
    

    二、 Domain [域]

    1、简介

    该 API 即将被废弃。我们也就不多了解。大概的阐述一下,这个即将被废弃的 API 有什么作用
    NodeJS 提供了 domain 模块,可以简化异步代码的异常处理。在介绍该模块之前,我们需要首先理解“域”的概念。简单的讲,一个域就是一个 JS 运行环境,在一个运行环境中,如果一个异常没有被捕获,将作为一个全局异常被抛出。

    2、函数

    require('domain').create()
    require('domain').run()
    require('domain').add(emitter)
    require('domain').remove(emitter)
    require('domain').bind(emitter)
    等等

    3、例子

    const d = require('domain').create();
    d.on('error', (er) => {
      // The error won't crash the process, but what it does is worse!
      // Though we've prevented abrupt process restarting, we are leaking
      // resources like crazy if this ever happens.
      // This is no better than process.on('uncaughtException')!
      console.log('error, but oh well', er.message);
    });
    
    d.run(() => {
      require('http').createServer((req, res) => {
        handleRequest(req, res);
      }).listen(PORT);
    });
    

    4、运行结果

     E:2NodeJSApi>node domain.js
    	error, but oh well PORT is not defined
    

    三、 Error [错误]

    1、简介

    在 nodejs 中运行的程序,我们一般会遇到 四中类型的错误

    第一种, 标准的 JavaScript 错误;
    1. < EvalError > 当 调用 eval() 失败时 抛出
    2. < SyntaxError > 当 Javascript 语法错误 时 抛出
    3. < RangeError > 当一个值超出预期范围时 抛出
    4. < TypeError > 当传入错误类型参数时 抛出
    5. < URIError > 当一个全局的 URI 处理函数被误用 时抛出
    第二种,由底层操作系的触发的系统错误;

    例如试图打开一个不存在的文件、试图向一个已关闭的 socket 发送数据等。

    第三种,由应用程序代码触发的用户自定义的错误;
    第四种,断言错误是错误的一个特殊的类

    每当 Node.js 检测到一个不应该发生的异常逻辑时会触发。 这类错误通常由 assert 模块触发。

    2、函数

    一个通用的 JavaScript Error 对象,它不表示错误发生的具体情况。 Error 对象会捕捉一个“堆栈跟踪”,详细说明被实例化的 Error 对象在代码中的位置,并可能提供错误的文字描述。

    	const error = new Error(message)
    	error.message
    	error.stack
    

    3、例子

    
    // 抛出一个 ReferenceError,因为 z 为 undefined
    try {
      const m = 1;
      const n = m + z;
    } catch (err) {
      // 在这里处理错误。
      console.log(err)
    }
    
    // E:2NodeJSApi>node error.js
    // ReferenceError: z is not defined
    
    
    // 抛出一个 RangeError
    require('net').connect(-1);
    // RangeError: "port" option should be >= 0 and < 65536: -1
    
    
    // 抛出一个 SyntaxError
    try {
      require('vm').eval('binary ! isNotOk');
    } catch(err) {
      // err 是一个 SyntaxError
      console.log(err)
    }
    
    
    require('url').parse(() => { });
      // 抛出 TypeError,因为它期望的是一个字符串
    
    try {
      decodeURIComponent('%');
    } catch (e) {
      console.log(e instanceof URIError); // true
      console.log(e.message);             // "malformed URI sequence"
      console.log(e.name);                // "URIError"
      console.log(e.fileName);            // "Scratchpad/1"
      console.log(e.lineNumber);          // 2
      console.log(e.columnNumber);        // 2
      console.log(e.stack);               // "@Scratchpad/2:2:3
    "
    }
    
    // 抛出 URIError,URI 处理函数被误用
    
    

    4、运行结果

    
    	ReferenceError: z is not defined
    	
    	throw new RangeError('"port" option should be >= 0 and < 65536: ' + port)
    	...
    	...
    	...
    

    5、常见的系统错误

    error.code : 返回一个表示错误码的字符串,总是 E 带上一串大写字母
    例如
    1、 EACCES (拒绝访问): 试图以被一个文件的访问权限禁止的方式访问一个文件。
    2、EADDRINUSE (地址已被使用)
    3、ECONNREFUSED (连接被拒绝): 无法连接,因为目标机器积极拒绝。 这通常是因为试图连接到外部主机上的废弃的服务。
    4、ECONNRESET (连接被重置): 一个连接被强行关闭。 这通常是因为连接到远程 socket 超时或重启。 常发生于 http 和 net 模块
    5、EEXIST (文件已存在): 一个操作的目标文件已存在,而要求目标不存在。
    6、EISDIR (是一个目录): 一个操作要求一个文件,但给定的路径是一个目录。
    7、EMFILE (系统打开了太多文件): 已达到系统文件描述符允许的最大数量,且描述符的请求不能被满足直到至少关闭其中一个。 当一次并行打开多个文件时会发生这个错误,尤其是在进程的文件描述限制数量较低的操作系统(如 OS X)。 要解决这个限制,可在运行 Node.js 进程的同一 shell 中运行 ulimit -n 2048
    8、ENOENT (无此文件或目录): 通常是由 fs 操作引起的,表明指定的路径不存在,即给定的路径找不到文件或目录。
    9、ENOTDIR (不是一个目录): 给定的路径虽然存在,但不是一个目录。 通常是由 fs.readdir 引起的。
    10、ENOTEMPTY (目录非空): 一个操作的目标是一个非空的目录,而要求的是一个空目录。 通常是由 fs.unlink 引起的。
    11、EPERM (操作不被允许): 试图执行一个需要更高权限的操作
    12、EPIPE (管道损坏): 写入一个管道、socket 或 FIFO 时没有进程读取数据。 常见于 net 和 http 层,表明远端要写入的流已被关闭
    13、ETIMEDOUT (操作超时): 一个连接或发送的请求失败,因为连接方在一段时间后没有做出合适的响应。 常见于 http 或 net。 往往标志着 socket.end() 没有被正确地调用。

  • 相关阅读:
    (转)Python之路,Day6
    (转)函数作用域,匿名函数,函数式编程,面向过程,面向对象
    (转)面向对象编程初步
    day26-多态、封装、反射
    (转)面向对象进阶
    MySql-Mysql技术内幕~SQL编程学习笔记(1)
    Spring MVC-学习笔记(4)数据绑定流程
    Mybatis-学习笔记(10)调用存储过程、存储函数
    Mybatis-学习笔记(9)Mybatis3+spring4+springMVC
    Mybatis-学习笔记(8)常用的注解
  • 原文地址:https://www.cnblogs.com/erbingbing/p/6396300.html
Copyright © 2020-2023  润新知