写点什么

【Node.js 】开发中遇到的多进程‘keylog‘ 事件以及 TLS/SSL 的解决学习方案实战

作者:黎燃
  • 2022-11-27
    内蒙古
  • 本文字数:2776 字

    阅读完需:约 9 分钟

多进程

Js 以单线程模式运行,但它使用事件驱动来处理并发,这有助于我们在多核 cpu 系统上创建多个子进程,从而提高性能。


const child_process = require('child_process'); for(var i=0; i<3; i++) {   var workerProcess = child_process.spawn('node', ['support.js', i]);    workerProcess.stdout.on('data', function (data) {      console.log('stdout: ' + data);   });    workerProcess.stderr.on('data', function (data) {      console.log('stderr: ' + data);   });    workerProcess.on('close', function (code) {      console.log('子进程已退出,退出码 '+code);   });}
复制代码


每个子进程始终有三个流对象:子 stdin、子。标准输出和子标准错误它们可以共享父进程的 stdio 流,也可以是独立的分流流对象。节点提供子进程_进程模块用于创建子进程。方法如下:


child_process.exec(command[, options], callback)
复制代码


exec-child_进程。Exec 使用子进程执行命令,缓存子进程的输出,并以回调函数参数的形式返回子进程的结果。派生子进程。Spawn 使用指定的命令行参数创建新进程。fork-child 进程。Fork 是一种特殊形式的派生(),用于在子进程中运行的模块。例如,fork('./son.js')相当于派生('node',['./sonjs'])。与派生方法不同,fork 将在父进程和子进程之间建立通信管道,用于进程之间的通信。


const fs = require('fs');const child_process = require('child_process'); for(var i=0; i<3; i++) {    var workerProcess = child_process.exec('node support.js '+i, function (error, stdout, stderr) {        if (error) {            console.log(error.stack);            console.log('Error code: '+error.code);            console.log('Signal received: '+error.signal);        }        console.log('stdout: ' + stdout);        console.log('stderr: ' + stderr);    });     workerProcess.on('exit', function (code) {        console.log('子进程已退出,退出码 '+code);    });}
复制代码

常用工具

util.callbackify(original)将异步异步函数(或返回值为 Promise 的函数)转换为遵循异常优先回调样式的函数,例如,将(err,value)=>…callback 作为最后一个参数。在回调函数中,第一个参数是拒绝的原因(如果 Promise 被解析为 null),第二个参数是要解析的值。


const util = require('util');
async function fn() { return 'hello world';}const callbackFunction = util.callbackify(fn);
callbackFunction((err, ret) => { if (err) throw err; console.log(ret);});
复制代码


回调函数异步执行,并具有异常堆栈错误跟踪。如果回调函数引发异常,则进程将触发“uncaughtException”异常。如果未捕获,则进程将退出。Null 作为回调函数中的参数具有特殊意义。如果回调函数的第一个参数是 promise 拒绝的原因,并且具有返回值,并且该值可以转换为布尔值 false,则该值将封装在 Error 对象中,并且可以通过属性 reason 获得。


function fn() {  return Promise.reject(null);}const callbackFunction = util.callbackify(fn);
callbackFunction((err, ret) => { err && err.hasOwnProperty('reason') && err.reason === null; // true});
复制代码


当 Promise 被以 null 拒绝时,它被包装为 Error 并且原始值存储在 reason 中。我们定义了一个基本对象 base 和从 base 继承的子对象。Base 有三个在构造函数中定义的属性,原型中定义的一个函数 inherits 实现继承。操作结果如下:


base Hello base { name: 'base', base: 1991, sayHello: [Function] } sub { name: 'sub' }
复制代码


Sub 只继承 Base 在原型中定义的函数,而在构造函数中创建的 Base 属性和 sayHello 函数不被 Sub 继承。同时,原型中定义的属性将不会被合并。日志将作为对象的属性输出。如果我们删除 objSub sayHello();该行中的注释将显示:


var util = require('util'); function Person() {     this.name = 'byvoid';     this.toString = function() {     return this.name;     }; } var obj = new Person(); console.log(util.inspect(obj)); console.log(util.inspect(obj, true)); 
复制代码

'keylog' 事件

当此代理管理的连接生成或接收密钥材料时(通常在握手完成之前,但不一定),将触发密钥日志事件。此密钥材料可以存储用于调试,因为它允许解密捕获的 TLS 流量。它可以为每个套接字触发多次。如果我们编写一段 js 代码并在浏览器中运行,我们就是在进行前端开发。若我们编写一段 js 代码并在 node 中运行它,我们就是在进行后端开发。



作为 JavaScript 运行环境,node。js 提供了基本的函数和 API:(许多框架都是从 node.js 派生的)Express 框架(快速构建 web 应用程序)Electron 框架(快速构建跨平台桌面应用程序)Restify 框架(快速构建 API 接口项目)读写数据库,创建实用的命令行工具以帮助前端开发

TLS/SSL

tls 模块使用 OpenSSL 提供传输层安全性(tls)和安全套接字层(SSL):加密流通信。TLS/SSL 是一种公钥/私钥基础设施。每个客户端和服务器都需要一个私钥。创建私钥的方法如下:


openssl genrsa -out ryans-key.pem 2048
复制代码


openssl pkcs12 -export -in agent5-cert.pem -inkey agent5-key.pem \    -certfile ca-cert.pem -out agent5.pfx
复制代码


TLS 协议允许客户端协商 TLS 会话的某些方法内容。然而,会话协商需要服务器响应的资源。这使其成为拒绝服务攻击的潜在媒介。


var ciphers = tls.getCiphers();console.log(ciphers); // ['AES128-SHA', 'AES256-SHA', ...]
复制代码


“正向保密”或“完全正向保密-完全正向保密”协议描述了密钥协商(如密钥交换)方法的特点。事实上,这意味着即使服务器的密钥是危险的,通信也只能被一类人窃听,他们必须尝试获取为每个会话生成的密钥对。通过在每次握手期间随机生成用于密钥协商的密钥对(而不是针对所有会话使用一个密钥)来实现完全前向保密。实现这项技术(提供完全前向保密)的方法被称为“短暂”。


var tls = require('tls');var fs = require('fs');
var options = { key: fs.readFileSync('server-key.pem'), cert: fs.readFileSync('server-cert.pem'),
// This is necessary only if using the client certificate authentication. requestCert: true,
// This is necessary only if the client uses the self-signed certificate. ca: [ fs.readFileSync('client-cert.pem') ]};
var server = tls.createServer(options, function(socket) { console.log('server connected', socket.authorized ? 'authorized' : 'unauthorized'); socket.write("welcome!\n"); socket.setEncoding('utf8'); socket.pipe(socket);});server.listen(8000, function() { console.log('server bound');});
复制代码


发布于: 刚刚阅读数: 4
用户头像

黎燃

关注

前端工程师 2022-05-06 加入

专注学习分享前端知识。

评论

发布
暂无评论
【Node.js 】开发中遇到的多进程‘keylog‘ 事件以及TLS/SSL的解决学习方案实战_前端_黎燃_InfoQ写作社区