内容简介: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钩子[同步版]
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Head First Web Design
Ethan Watrall、Jeff Siarto / O’Reilly Media, Inc. / 2009-01-02 / USD 49.99
Want to know how to make your pages look beautiful, communicate your message effectively, guide visitors through your website with ease, and get everything approved by the accessibility and usability ......一起来看看 《Head First Web Design》 这本书的介绍吧!