1. OS
Web浏览器中的JavaScript无法获取有关操作系统(OS)的信息,但Node可以
const os = require('os');console.log('操作系统信息 -------------');os.arch(); // x64os.platform(); // win32os.type(); // Windows_NTos.uptime(); // 53354.5432871os.hostname(); // DESKTOP-RRANDNCos.release(); // 10.0.15063console.log('路径 -------------');os.homedir(); // C:甥敳獲gpleeos.tmpdir(); // C:甥敳獲gpleeAppDataLocalTempconsole.log('内存信息 -------------');os.freemem(); // 9122930688os.totalmem(); // 17060175872
说明:
- os.type():显示操作系统类型
- os.uptime():操作系统启动后的时间
- os.hostname():显示计算机名称
- os.release():显示操作系统版本
- os.homedir():显示主目录路径
- os.freemem ():显示可用的RAM
- os.totalmem():显示整个内存容量
2. Path
它有助于处理文件夹和文件路径
- Path 模块非常有用,因为每个操作系统都有不同的路径界定符
- Windows类型和POSIX类型
- Window type:用separated分隔(即C:₩Users₩gplee)
- POSIX类型用于基于Unix的操作系统,例如macOS和Linux
- POSIX类型(POSIX type):以/分隔(即/ home / gplee)
const path = require('path');const string = __filename;path.sep; // / path.delimiter;// :path.dirname(string);// /Users/gp/Desktop/node_modulepath.extname(string);// .jspath.basename(string);// path.jspath.basename(string, path.extname(string));// pathpath.parse(string);// { root: '/',// dir: '/Users/gp/Desktop/node_module',// base: 'path.js',// ext: '.js',// name: 'path' // }// path.format(): C:甥敳獲gplee/pathjspath.format({ dir: 'C:甥敳獲gplee', name: 'path', ext: 'js',});// C:甥敳獲gplee/pathjspath.normalize('C://usersgpleepath.js');// C:/usersgpleepath.jspath.isAbsolute('C:');// falsepath.isAbsolute('./home');// falsepath.relative('C:甥敳獲gpleepath.js', 'C:');// ../C:path.join(__dirname, '..', '..', '/users', '.', '/', 'gplee');// /Users/gp/Desktop/users/gpleepath.resolve(__dirname, '..', 'users', '.', '/gplee');// /gplee
说明:
- __filename, __dirname 分别代表当前文件和当前文件夹路径
- path:sep:路径界定符 (i.e., Windows : , POSIX : / )
- path.delimiter:环境变量界定符 (i.e., Windows : ; , POSIX :)
- path.dirname(path):文件路径
- path.extname(path):文件扩展名
- path.basename(path, extension):文件名
- path.parse(path) :将文件路径分隔为根,目录,基数,扩展名,名称
- path.format(object) :path.parse() 对象到文件路径
- path.noramlize(path) :删除重复项 /
- path.isAbsolute(path):return boolean告诉文件路径是绝对路径还是相对路径
- path.join(path, …):结合成一个路径
- path.resolve(path, …):结合成一个路径
difference between path.join & path.resolve--- path.resolve : absolute path- path.join : relative pathpath.join('/a', '/b', 'c'); // /a/b/cpath.resolve('/a', '/b', 'c'); // /b/c
3. Url
它有助于操纵互联网地址(URL)
- 它们是两种类型的url操作 1)WHATWG url 2)传统节点url
const url = require('url');const URL = url.URL;const myURL = new URL('https://www.integralist.co.uk/posts/cognito/#authentication-vs-authorization');console.log('new URL():', myURL);// new URL(): URL {// href:// 'https://www.integralist.co.uk/posts/cognito/#authentication-vs-authorization',// origin: 'https://www.integralist.co.uk',// protocol: 'https:',// username: '',// password: '',// host: 'www.integralist.co.uk',// hostname: 'www.integralist.co.uk',// port: '',// pathname: '/posts/cognito/',// search: '',// searchParams: URLSearchParams {},// hash: '#authentication-vs-authorization' }console.log('url.format():', url.format(myURL));// url.format(): https://www.integralist.co.uk/posts/cognito/#authentication-vs-authorizationconsole.log('--------');const parsedUrl = url.parse('https://www.integralist.co.uk/posts/cognito/#authentication-vs-authorization');console.log('url.parse():', parsedUrl);// url.parse(): Url {// protocol: 'https:',// slashes: true,// auth: null,// host: 'www.integralist.co.uk',// port: null,// hostname: 'www.integralist.co.uk',// hash: '#authentication-vs-authorization',// search: null,// query: null,// pathname: '/posts/cognito/',// path: '/posts/cognito/',// href:// 'https://www.integralist.co.uk/posts/cognito/#authentication-vs-authorization'}console.log('url.format():', url.format(parsedUrl));// url.format(): https://www.integralist.co.uk/posts/cognito/#authentication-vs-authorization
url.parse(address) : 分解 url
url.format(object) : 重新组装 url
4. querystring
将url的searchParams转换为对象
const url = require('url');const querystring = require('querystring');const parsedUrl = url.parse('http://www.google.com/?page=3&limit=10&category=nodejs&category=javascript');const query = querystring.parse(parsedUrl.query);query;// [Object: null prototype] { page: '3', limit: '10', category:// [ 'nodejs', 'javascript' ] }querystring.stringify(query);// page=3&limit=10&category=nodejs&category=javascript
querystring.parse(query):url查询到JavaScript对象
querystring.stringify(object):查询对象到字符串
5. crypto(加密)
1. 单向加密
无法解密的加密,例如,用户的密码不需要解密(只需比较数据库中的加密密码和用户从登录名输入的内容)
Hash
const crypto = require('crypto');crypto.createHash('sha512').update('password').digest('base64');// sQnzu7wkTrgkQZF+0G1hi5AI3Qmzvv0bXgc5THBqi7mAsdd4Xll27ASbRt9fEyavWi6m0QP9B8// lThf+rDKy8hg==crypto.createHash('sha512').update('password').digest('hex');// b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e597// 6ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86crypto.createHash('sha512').update('another password').digest('base64');// OQ3BGSirE9o4ruKs+kwx43TCX/leAU5wO/D4IAQlLfppai4YsjoBbptGYiKFURkaWoenzb/FPe+Uy8K3Ufa77Q==
说明:
- createHash(algorithm) : 创建要使用的哈希算法,md5、sha、ha256、sha512可用
- update(string) : 要加密的字符串
- digest(encoding) : 编码算法,base64、十六进制、latin1;base64的结果字符串最短
pbkdf2 (string + salt)
const crypto = require('crypto');crypto.randomBytes(64, (err, buf) => { const salt = buf.toString('base64'); salt; // mLjnCvQoCTVwKuxBbLIuVowWz+PQL+itbMjxNmhVkd30+nFpQ9RHbmqXajVQVqyjNX98Osaf0Nwc // WeoHHNIceg== crypto.pbkdf2('password', salt, 100000, 64, 'sha512', (err, key) => { key.toString('base64');// /ypKwHUODb9G4VL6QBw7XAl5jrTZHtSqDeVTKmz5P8ZxZPo7vUwKCqPFPf5Va6lJHInh6zXe// hRaFAA9Cj/KBxQ== })})
说明:
- 使用 randomBytes 方法创建盐(salt)
- pdkdf2()方法采用1)字符串来加密“密码” 2)盐3)调用次数(重复)4)哈希算法作为参数
- 换句话说,上述方法使用sha512哈希算法将文本密码加密了10k次
- 1万次只需1秒
双向加密
加密可以解密;密钥用于加密和解密(相同密钥)。
cipher
const crypto = require('crypto');const cipher = crypto.createCipher('aes-256-cbc', 'key12');let result = cipher.update('a sentence to encrypt', 'utf8', 'base64');result += cipher.final('base64');console.log(result); // encryption: lxiXXOtkXXfz5+GczTE61DRCsU0c1+ANaBjwbuLwnxc=const decipher = crypto.createDecipher('aes-256-cbc', 'key12');let result2 = decipher.update(result, 'base64', 'utf8');result2 += decipher.final('utf8');console.log(result2);// a sentence to encrypt
说明
- crypto.createCipher(algorithm, key) : 使用的算法和密钥
- cipher.update(string, encoding, output encoding) : 我们使用utf8编码,并使用base64进行加密
- crypto.createDecipher(algorithm, key) : 用于解密(使用相同的加密算法和密钥)
- decipher.update(string, encoding, output encoding) : 与加密相同
- decipher.final(output encoding) : 与加密相同
6. util
util模块具有所有实用功能
const util = require('util');const crypto = require('crypto');const dontUseMe = util.deprecate((x,y) => { console.log(x+y); // 3 dontUseMe function is deprecated so do not use!}, 'dontUseMe function is deprecated so do not use!');dontUseMe(1,2);const randomBytesPromise = util.promisify(crypto.randomBytes);randomBytesPromise(64) .then((buf) => { console.log(buf.toString('base64')); // bjWZOhBROO8n60PORWrBaW7SWrYJux/O+p0MBw/7S+eAes7TIYJTFCrBTth96cxkLnLRhhSQaiEUHvYh50JhYA== }) .catch((error) => { console.error(error); })
说明:
- util.deprecate : 该函数表明该函数已被弃用
- util.promisify : 将回调模式更改为Promise模式,async/await