用了node 感觉就不需要用java了_用了node 感觉就不需要用java了


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


用了node 感觉就不需要用java了_用了node 感觉就不需要用java了_02


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


用了node 感觉就不需要用java了_用了node 感觉就不需要用java了_03


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)


用了node 感觉就不需要用java了_ci_04


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