内容简介:zlib 可以用来实现对 HTTP 中定义的 gzip 和 deflate 内容编码机制的支持。 HTTP 的 Accept-Encoding 头字段用来标记客户端接受的压缩编码。 使用 zlib 编码成本会很高, 结果应该被缓存。(下面的演示代码只演示压缩)crypto 模块提供了加密功能,包含对 OpenSSL 的哈希、HMAC、加密、解密、签名、以及验证功能的一整套封装.进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。进
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 常用核心模块(三)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Python第十一章-常用的核心模块01-collections模块
- Webpack 核心模块 tapable 解析
- 针对银行木马BokBot核心模块的深入分析
- 解读Node核心模块Stream系列一(Readable)
- LollipopGo框架-斗兽棋游戏开发基本核心模块
- 深入理解Webpack核心模块Tapable钩子[同步版]
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。