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 错误;
- < EvalError > 当 调用 eval() 失败时 抛出
- < SyntaxError > 当 Javascript 语法错误 时 抛出
- < RangeError > 当一个值超出预期范围时 抛出
- < TypeError > 当传入错误类型参数时 抛出
- < 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() 没有被正确地调用。