其他模块
zKing 2018-12-10 Node.js
# assert(断言)
assert 模块提供了断言测试的方法,用于测试不变式
module.exports = {
add:(...agrs) => {
return args.reduce((prev,cuur) => {
return prev + cuur;
})
},
mul:(...agrs) => {
return args.reduce((prev,cuur) => {
return prev * cuur;
})
}
}
const { add,mul } = require('./math')
const assert = require('assert')
// 平时用的判断
if(add(2,3) === 5){
console,log('add(2,3) ===5,OK')
},else{
console,log('add(2,3) !==5,err')
}
// 使用断言库的测试
assert.equal(add(2,3),5)
// 常用的第三方断言库 chai
const { should,expect } = require('chai')
add(2,3).should.equal(5)
expect(add(2,3)).to.be(5)
更多的测试,可以使用 mocha
# crypto(加密)
crypto 现在已经是 Node.js 的内置模块,主要用于加密数据使用。
我们可以获取支持的加密算法
const crypto = require('crypto');
console.log(crypto.getHashes());
以下是简单使用的示例
const crypto = require('crypto');
module.exports = {
md5: (str) => {
return crypto.createHash('md5').update(str).digest('hex');
},
sha1: (str) => {
return crypto.createHash('sha1').update(str).digest('hex');
}
}
# dns(域名服务器)
dns 模块包含两类函数:
- 第一类函数,使用底层操作系统工具进行域名解析,且无需进行网络通信。 这类函数只有一个:
dns.lookup()
- 第二类函数,连接到一个真实的 DNS 服务器进行域名解析,且始终使用网络进行 DNS 查询。
简单示例
const dns = require('dns');
dns.lookup('github.com', (err, address, family) => {
console.log('IP 地址: %j 地址族: IPv%s', address, family);
});
IP 地址: "13.250.177.223" 地址族: IPv4
const dns = require('dns');
dns.resolve4('github.com', (err, addresses) => {
if (err) throw err;
console.log(`IP 地址: ${JSON.stringify(addresses)}`);
addresses.forEach((a) => {
dns.reverse(a, (err, hostnames) => {
if (err) throw err;
console.log(`IP 地址 ${a} 逆向解析到域名: ${JSON.stringify(hostnames)}`);
});
});
});
IP 地址: ["52.74.223.119","13.229.188.59","13.250.177.223"]
IP 地址 13.229.188.59 逆向解析到域名: ["ec2-13-229-188-59.ap-southeast-1.compute.amazonaws.com"]
IP 地址 13.250.177.223 逆向解析到域名: ["ec2-13-250-177-223.ap-southeast-1.compute.amazonaws.com"]
IP 地址 52.74.223.119 逆向解析到域名: ["ec2-52-74-223-119.ap-southeast-1.compute.amazonaws.com"]
dns.lookup()
几乎总是解析给定的主机名与ping命令一样
dns.resolve()
, dns.resolve*()
and dns.reverse()
,它们不像dns.lookup()一样使用相同的配置文件。例如,它们不会使用来自/etc/hosts配置。而是使用异步网络通信。
# os(操作系统)
os 模块提供了一些操作系统相关的实用方法,写一下简单示例
const os = require("os");
// CPU 的字节序
console.log('endianness : ' + os.endianness());
// 操作系统名
console.log('type : ' + os.type());
// 操作系统名
console.log('platform : ' + os.platform());
// 系统内存总量
console.log('total memory : ' + os.totalmem() + " bytes.");
// 操作系统空闲内存量
console.log('free memory : ' + os.freemem() + " bytes.");
# util(实用工具)
util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足。
比如经常使用 util.promisify
来将回调函数转化成 Promise,避免回调地狱。
另外其他方法,直接写一下简单示例了
const util = require('util')
console.log(util.isArray([1, 2, 3])); // 判断类型方法
util.log('这是一个stout输出'); //带有时间戳的输出
console.log(util.format('%s:%s:%d', 'foo', 'bar', 123)); //格式化输出字符串
// ---- 实现原型继承
function Base() {
this.name = 'base';
this.base = 1991;
this.sayHello = function () {
console.log('Hello ' + this.name);
};
}
Base.prototype.showName = function () {
console.log(this.name);
};
function Sub() {
this.name = 'sub';
}
util.inherits(Sub, Base);
var objSub = new Sub();
objSub.showName();
console.log(objSub);
// ---- 注意:Sub 仅仅继承了Base 在原型中定义的函数,而构造函数内部创造的 base 属 性和 sayHello 函数都没有被 Sub 继承。
var objBase = new Base();
console.log(util.inspect(objBase, { // 自定义输出颜色之类的
showHidden: false,
depth: 2,
colors: true
}));
console.log(objBase)
# REPL(交互式解释器)
Node.js 中当然也有如同 C,JAVA那样的命令行交互操作,这就需要 REPL
模块来进行 Node 交互模式。(想起学 C 时写的简陋的学生管理系统)
Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输入命令,并接收系统的响应。
const repl = require('repl');
console.log("> 请输入 m");
console.log("> 请输入 .sayhello");
console.log("> 请输入 .saybye");
const replServer = repl.start({ prompt: '> ' });
Object.defineProperty(replServer.context, 'm', {
configurable: false,
enumerable: true,
value: 'msg'
});
replServer.defineCommand('sayhello', {
help: '打招呼',
action(name) {
this.bufferedCommand = '';
console.log(`你好,${name}!`);
this.displayPrompt();
}
});
replServer.defineCommand('saybye', function saybye() {
console.log('再见!');
this.close();
});
> 请输入 m
> 请输入 .sayhello
> 请输入 .saybye
> m
'msg'
> .sayhello
你好,!
> .saybye
再见!
- ctrl + c - 退出当前终端。
- ctrl + c 按下两次 - 退出 Node REPL。
- ctrl + d - 退出 Node REPL.