带你一起撸一遍 nodejs 常用核心模块(三)

in 编程
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9

压缩模块 zlib 可以用来实现对 HTTP 中定义的 gzip 和 deflate 内容编码机制的支持。 HTTP 的 Accept-Encoding 头字段用来标记客户端接受的压缩编码。 使用 zlib 编码成本会很高, 结果应该被缓存。(下面的演示代码只演示压缩)

 //compresss方法实现压缩 
compress(req, res, statObj, realPat) {    //实现压缩功能
    let encoding = req.headers['accept-encoding'];   //浏览器请求头会自动带上accept-encoding 告诉 服务器支持哪几种压缩格式
    if (encoding) {
        if (encoding.match(/\bgzip\b/)) {
            res.setHeader('content-encoding','gzip')
            return zlib.createGzip()    //返回压缩流  let zip = compress(req, res, statObj, realPat); 
            //通过fs.createReadStream(realPath).pipe(zip).pipe(res) 返回给客户端
        } else if (encoding.match(/\bdeflate\b/)) {
            res.setHeader('content-encoding', 'deflate')
            return zlib.createDeflate();  //返回压缩流  let zip = compress(req, res, statObj, realPat); 
            //通过fs.createReadStream(realPath).pipe(zip).pipe(res) 返回给客户端
        } else {
            return false
        }
    } else {
        return false
    }
}

加密和摘要算法 crypto 模块提供了加密功能,包含对 OpenSSL 的哈希、HMAC、加密、解密、签名、以及验证功能的一整套封装.

 let crypto = require('crypto');
console.log(crypto.getHashes());
[ 'DSA',
  'DSA-SHA',
  'DSA-SHA1',
  'DSA-SHA1-old',
  'RSA-MD4',
  'RSA-MD5',
  'RSA-MDC2',
  'RSA-RIPEMD160',
  'RSA-SHA',
  'RSA-SHA1',
  'RSA-SHA1-2',
  'RSA-SHA224',
  'RSA-SHA256',
  'RSA-SHA384',
  'RSA-SHA512',
  'dsaEncryption',
  'dsaWithSHA',
  'dsaWithSHA1',
  'dss1',
  'ecdsa-with-SHA1',
  'md4',
  'md4WithRSAEncryption',
  'md5',
  'md5WithRSAEncryption',
  'mdc2',
  'mdc2WithRSA',
  'ripemd',
  'ripemd160',
  'ripemd160WithRSA',
  'rmd160',
  'sha',
  'sha1',
  'sha1WithRSAEncryption',
  'sha224',
  'sha224WithRSAEncryption',
  'sha256',
  'sha256WithRSAEncryption',
  'sha384',
  'sha384WithRSAEncryption',
  'sha512',
  'sha512WithRSAEncryption',
  'shaWithRSAEncryption',
  'ssl2-md5',
  'ssl3-md5',
  'ssl3-sha1',
  'whirlpool' ]
 //几种常用的
let crypto = require('crypto');

// console.log(crypto.getHashes());
// 摘要算法
let str = 'hello';
let r = crypto.createHash('md5').update(str).digest('hex');
console.log(r)

let crypto = require('crypto');
let r2 = crypto.createHash('md5').update('hello').digest('hex')
console.log(r2)
let r1 = crypto.createHash('md5').update('h').update('ell').update('o').digest('hex')
console.log(r1)

// 加盐算法
let mac = crypto.createHmac('sha256', 'xl');  //用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出
let r = mac.update('hello').digest('hex')
console.log(r)

process - 进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
process 对象是一个全局变量,它提供当前 Node.js 进程的有关信息,以及控制当前 Node.js 进程。
'exit' 事件
两种情况下 'exit' 事件会被触发:
显式调用 process.exit() 方法,使得 Node.js 进程即将结束;
Node.js 事件循环数组中不再有额外的工作,使得 Node.js 进程即将结束。
'message' 事件
消息通过 childprocess.send() 发送),会触发 'message' 事件。具体用法演示下面额外管道 ipc模式有. 3. 'kill' 事件 -- 注意只有父进程才可以kill子进程
process.kill(pid[, signal]) //pid 进程id 可以通过process.pid获取
child_process - 子进程 父子进程之间建立管道有三种模式 pipe/0,1,2/ignore,
默认情况下,子进程的 stdin、 stdout 和 stderr 会重定向到 ChildProcess 对象上相应的 subprocess.stdin、 subprocess.stdout 和 subprocess.stderr 流
0,1,2是共享输入输出(继承父进程输入输出)的不再演示
ignore
额外的 fd 可以被指定来创建父进程和子进程之间的额外管道
1.额外管道pipe模式

 //pipe模式

//主进程
let {spawn} = require('child_process');
let path = require('path');
// 启动一个子进程
let child = spawn('node', ['sub_process1.js', '--port', '3000'], {
    cwd: path.join(__dirname, 'test'),            //sub_prpcesss1.js文件路径
    stdio:[0,1,2,'pipe']          //默认pipe  (stdin、stdout 和 stderr  --> 0、1 和 2  ==>共享标准输入,标准输出,错误输出)
})
child.stdout.on('data', function (data) {  //接收子进程的数据
    console.log(data.toString())
})

//被启动的子进程
console.log(process.argv)  //子进程输出数据
process.stdout.write('123')   //
---------------------------------------------------
//最终在控制台打出的结果
[ 'C:\\Program Files\\nodejs\\node.exe',
  'c:\\Users\\Administrator\\Desktop\\growth_plan\\Everest4\\22.process\\test\\sub_process1.js',
  '--port',
  '3000' ]

额外管道 ipc模式

 // on  send

//主进程
let {spawn} = require('child_process');
let path = require('path');

let child = spawn('node', ['03.ipc.js',],{
    cwd:path.join(__dirname, 'test'),
    stdio:[0,1,2,'ipc']  
})
child.on('message', function(data){
    console.log(data);
    child.send('world');
    // process.kill(child.pid)   //主进程可以强制杀死子进程
})

// 子进程 03.ipc.js
process.send('hello');

process.on('message',function(data){
    console.error(data);
    process.exit();   //执行完退出进程
})

另外常用的fork其实就是衍生一个新的 Node.js 进程,并通过建立 IPC 通讯通道来调用指定的模块,该通道允许父进程与子进程之间相互发送信息。

 //主进程
let {fork} = require('child_process');
let path = require('path');
let child = fork('04.fork.js',['a','b'],{
    cwd:path.join(__dirname,'test'),
    silent:false                           // 如果为 true,则子进程中的 stdin、 stdout 和 stderr 会被导流到父进程中,否则它们会继承自父进程。
})

child.send('hello')
child.on('message', function(data) {
    console.log(data)
})
//子进程 04.fork.js
process.send('end')
process.on('message', function(data) {
    console.log(data)
    process.exit()
})

集群 为了提高服务器的利用率,能不能多核的来处理呢?于是就有了cluster模块。 cluster模块可以轻松实现运行在同一机器不同进程上的TCP或HTTP服务器集群。它们仍使用相同的底层套接字,从而在相同的IP地址和端口组合上处理请求。
进程并不是开的越多越好,一般是服务器有几核一般开几个进程;

 let cluster = require('cluster');
let http = require('http');

let len = require('os').cpus().length;   //获取cpu的核数
if (cluster.isMaster) {//主进程 
    for(let i = 0; i<len; i++) {     //有几核就开几个子进程   
        cluster.fork()     
    }
} else {
    http.createServer(function(req, res) {
        res.end('child'+process.pid)
    }).listen(3000)
}
 //主进程
let os = require('os');

let {fork} = require('child_process');
let path = require('path');
let http = require('http');

let server = http.createServer(function(req, res) {
    res.end('xxx');
})
server.listen(3000)    //开了一个3000端口
for(let i = 0; i<os.cpus().length;i++){
    let child = fork('1.server.js',{
        cwd: path.join(__dirname),
        silent:false
    });

    child.send('server', server)    //公用服务
}
//子进程 1.server.js
let http = require('http');
process.on('message',function(data,server){
    http.createServer(function(req,res){
        res.end('child'+process.pid)
    }).listen(server); // 子进程公用这个服务
});

以上就是nodejs的常用核心模块的一部分,因为涉及的内容比较多并没有深入进去,特别是加密和摘要算法这一块,我也仅仅是会用,其实每个部分都可以展开里面有很多知识,很多深入的知识我本人也不是很了解,希望上面的一些核心内容能够帮助到你,当然有很多不足之处希望朋友们提出指正。也希望和各位朋友一起学习分享!
相关内容:
nodejs常用核心模块(一)
nodejs常用核心模块(二)
后记:
nodejs常用核心模块到这里就结束了,可能有很多零零散散的一些知识点没有提到,希望大家看完这一系列的文章有一些收获,同时有不足之处和常用但是没有提到的知识点希望朋友们提出指正,互相交流,共同进步!
转载于猿2048:➻《带你一起撸一遍 nodejs 常用核心模块(三)》

关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9
扫一扫关注公众号添加购物返利助手,领红包
Comments are closed.

推荐使用阿里云服务器

超多优惠券

服务器最低一折,一年不到100!

朕已阅去看看