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:\2\NodeJS\Api>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:\2\NodeJS\Api>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\n"
}

// 抛出 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() 没有被正确地调用。

转载于:https://www.cnblogs.com/erbingbing/p/6396300.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值