Node.js在child_process域和错误冒泡及捕获实践

目录
  • child_process
  • options.detached
  • cipher.update
  • 错误的冒泡和捕获

child_process

child_进程模块提供派生子进程的功能。它与popen(3)相似但不相同。此函数主要由[child_process.spown()]函数提供:

const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/usr']);
ls.stdout.on('data', (data) => {
  console.log(`输出:${data}`);
});
ls.stderr.on('data', (data) => {
  console.log(`错误:${data}`);
});
ls.on('close', (code) => {
  console.log(`子进程退出码:$[code]`);
});
const { exec } = require('child_process');
exec('my.bat', (err, stdout, stderr) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(stdout);
});
// 文件名带有空格的脚本:
const bat = spawn('"my script.cmd"', ['a', 'b'], { shell: true });
// 或:
exec('"my script.cmd" a b', (err, stdout, stderr) => {
  // ...
});

child_进程模块还提供一些其他同步和异步可选功能。每个函数都是基于[child_process.spawn()]或[child_process.spawnSync()]实现的。

[child_process.exec()]:派生一个shell并在该shell上运行命令。完成后,stdout和stderr将传递给回调函数。

const { spawn } = require('child_process');
const grep = spawn('grep', ['ssh']);
grep.on('close', (code, signal) => {
  console.log(`子进程收到信号 ${signal} 而终止`);
});
// 发送 SIGHUP 到进程
grep.kill('SIGHUP');

[child_process.execFile()]:类似于[child_procedure.exec()],但命令是直接派生的,而不首先派生shell。

[child_process.f分叉()]:派生一个新的NodeJs进程,并通过建立IPC通信通道调用指定的模块,这允许父进程和子进程相互发送信息。

[child_process.execSync()]:[child_procedure.exec()]的同步函数阻止节点J的事件循环。

[child_process.execFileSync()]:[child_cess.execFile()]的同步函数阻止节点J的事件循环。

options.detached

在Windows上,设置选项如果分离为true,则子进程可以在父进程退出后继续运行。子进程有自己的控制台窗口。一旦启用了子进程,就不能禁用它。

在非Windows平台上,如果选项if detached设置为true,则子进程将成为新进程组和会话的领导者。请注意,子进程可以在父进程退出后继续运行,无论它们是否分离。

详见setsid(2)。

const fs = require('fs');
const { spawn } = require('child_process');
const out = fs.openSync('./out.log', 'a');
const err = fs.openSync('./out.log', 'a');
const subprocess = spawn('prg', [], {
  detached: true,
  stdio: [ 'ignore', out, err ]
});
subprocess.unref();

默认情况下,父进程将等待分离的子进程退出。为了防止父进程等待给定的子进程,可以使用子进程Unref()方法。这将导致父进程的事件循环排除子进程的引用计数,使父进程独立于子进程退出,除非在子进程和父进程之间建立了IPC通道。

使用分离选项启动长时间运行的进程时,除非提供了未连接到父进程的stdio配置,否则父进程退出后,该进程将不会在后台继续运行。如果继承了父进程的stdio,则子进程将保持与控制终端的连接。

例如,对于长时间运行的进程,为了忽略父进程的终止,父进程的stdio文件描述符被分离并忽略:

const { spawn } = require('child_process');
const subprocess = spawn(process.argv[0], ['child_program.js'], {
  detached: true,
  stdio: 'ignore'
});
subprocess.unref();

如果未传递信号,[ChildProcess]对象可能会触发['error']事件。向已退出的子进程发送信号不是错误,但可能会产生不可预测的后果。

特别是,如果一个进程的PID被重新分配给另一个进程,则该信号将被发送给该进程,这可能会导致意外的结果。

注意,当函数被称为kill时,发送给子进程的信号实际上可能不会终止该进程。

'use strict';
const { spawn } = require('child_process');
const subprocess = spawn(
  'sh',
  [
    '-c',
    `node -e "setInterval(() => {
      console.log(process.pid, 'is alive')
    }, 500);"`
  ], {
    stdio: ['inherit', 'inherit', 'inherit']
  }
);
setTimeout(() => {
  subprocess.kill(); // 不会终止 shell 中的 node 进程
}, 2000);

一旦套接字被传递给子进程,父进程就无法再跟踪套接字何时被销毁。若要显示此属性,连接属性将变为空。发生这种情况时,不建议使用。

最大连接数。 建议子进程中的任何消息处理程序都应验证套接字是否存在,因为连接在发送到子进程期间可能会关闭。

cipher.update

用数据更新密码。如果给定inputEncoding参数,其值必须为“utf8”、“ascii”或“latin1”,并且数据参数是使用指定编码的字符串。如果未给定inputEncoding参数,则数据必须为Buffer、TypedArray或DataView。如果数据是Buffer、TypedArray或DataView,则忽略inputEncoding。

OutputEncoding指定加密数据的输出格式,可以是“latin1”、“base64”或“hex”。如果指定了outputEncoding,则返回具有指定编码的字符串。如果未提供outputEncoding,将返回Buffer。 密码。

update()方法可以用新数据多次调用,直到调用密码Final()。

['cipher.final()'][]调用密码。update()。

final()将抛出错误。

const crypto = require('crypto');
const decipher = crypto.createDecipher('aes192', 'a password');
let decrypted = '';
decipher.on('readable', () => {
  const data = decipher.read();
  if (data)
    decrypted += data.toString('utf8');
});
decipher.on('end', () => {
  console.log(decrypted);
  // Prints: some clear text data
});
const encrypted =
    'ca981be48e90867604588e75d04feabb63cc007a8f8ad89b10616ed84d815504';
decipher.write(encrypted, 'hex');
decipher.end();
const crypto = require('crypto');
const fs = require('fs');
const decipher = crypto.createDecipher('aes192', 'a password');
const input = fs.createReadStream('test.enc');
const output = fs.createWriteStream('test.js');
input.pipe(decipher).pipe(output);

返回所有剩余的解密内容。如果outputEncoding参数是“latin1”、“ascii”或“utf8”之一,则返回字符串。如果未提供输出编码,则返回Buffer。

一旦解密了final()方法,decipher对象就不能再用于解密数据。正在尝试调用解密。final()多次导致抛出错误。

const crypto = require('crypto');
const assert = require('assert');
// Generate Alice's keys...
const alice = crypto.createDiffieHellman(2048);
const aliceKey = alice.generateKeys();
// Generate Bob's keys...
const bob = crypto.createDiffieHellman(alice.getPrime(), alice.getGenerator());
const bobKey = bob.generateKeys();
// Exchange and generate the secret...
const aliceSecret = alice.computeSecret(bobKey);
const bobSecret = bob.computeSecret(aliceKey);
// OK
assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex'));

错误的冒泡和捕获

节点。Js支持几种机制来冒泡和处理应用程序运行时发生的错误。如何报告和处理这些错误完全取决于错误的类型和调用的API的样式。 所有JavaScript错误都将被视为异常。将立即生成异常,并使用标准JavaScript抛出机制抛出错误。这些都是使用JavaScript语言提供的try/catch语句处理的。

try {
  const m = 1;
  const n = m + z;
} catch (err) {
  // 在这里处理错误。
}

任何使用JavaScript的抛出机制都会导致异常。异常必须用try/catch处理,否则Node.js进程将立即退出。 除了少数例外,同步API(任何不接受回调函数的阻塞方法,如[fs.readFileSync])将使用throw来报告错误。 异步API中的错误可以通过几种方式报告: 大多数异步方法都接受回调函数,该函数接受Error对象作为第一个参数。如果第一个参数不是null,而是一个Error实例,则表示发生了错误,应进行处理。

以上就是Node.js在child_process域和错误冒泡及捕获实践的详细内容,更多关于Node.js child_process错误捕获的资料请关注我们其它相关文章!

(0)

相关推荐

  • JavaScript 转义字符JSON parse错误研究

    目录 JSON 字符串转换为 JavaScript 对象 找到 Scanner::Scan() 函数关键代码: ScanString() 函数 JSON 字符串转换为 JavaScript 对象 JSON.parse 将一个 JSON 字符串转换为 JavaScript 对象. JSON.parse('{"hello":"\world"}') 以上代码输出: {  hello: "world"} 是一个 JavaScript 对象,但是仔细观察会

  • JavaScript中直接写undefined的用法剖析

    目录 介绍 原因 解决 结语 介绍 众所周知,在JavaScript 语言中,一个没有被赋值的变量会有个默认值 undefined ,而 undefined 作为全局对象的一个属性经常会用作一些赋值返回,逻辑判断等业务场景中.可本期要说的是,尽量不要直接去拼写 undefined 了,因为那是不太严谨的行为,可能出现很多意外情况. 原因 我们经常在判断某个变量是否等于 undefined ,如下: function test(value) { if (value === undefined) {

  • Laravel Validator自定义错误返回提示消息并在前端展示

    前言 Laravel Validator 默认返回的是英文的提示消息,而大多数情况我们需要自定义错误返回提示消息,本文将介绍一下如何自定义错误消息,并在前端展示. 自定义错误消息 别怪我太直接,代码奉上 $messages = [ 'phone.unique' => '重复的电话号码', 'required' => '请将信息填写完整', ]; $this->validate($request, [ 'phone' => 'required|unique:table_name',

  • JS前端错误监控捕获以及上报方法详解

    目录 前端错误捕获方法 不同场景错误处理方式 错误信息上报 ajax进行上报 image上报 sendBeacon 前端错误捕获方法 前端捕获错误的方法: try..catch:捕获的异常必须是线程执行进入到try...catch且try...catch未执行完的时候抛出来. 语法异常在语法检查阶段就报错了,线程尚未进入try...catch代码块,所以无法捕获到异常. try { a. }catch(e) { console.log('catch error:', e) } 不能捕获setTi

  • vue项目前端错误收集之sentry教程详解

    sentry简介 Sentry 是一个开源的错误追踪工具,可以帮助开发人员实时监控和修复系统中的错误.其专注于错误监控以及提取一切事后处理所需的信息;支持几乎所有主流开发语言( JS/Java/Python/php )和平台, 并提供了web来展示输出错误. sentry官网: https://sentry.io/ sentry安装 sentry 是一个开源的工具,可以自行搭建. 官方支持两种安装和运行 Sentry 服务器的方法, Docker 和 Python .推荐使用 Docker .

  • 前端项目中的Vue、React错误监听

    目录 一. Vue 错误监听 window.onerror errorCaptured 生命周期 errorHandler 异步错误 答案 扩展 二.React 错误监听 ErrorBoundary dev 和 build 事件报错 异步错误 答案 扩展 一. Vue 错误监听 题目: 如何统一监听 Vue 组件报错? 分析: 真实项目需要闭环,即考虑各个方面,除了基本的功能外,还要考虑性能优化.报错.统计等. 而个人项目.课程项目一般以实现功能为主,不会考虑这么全面.所以,没有实际工作经验的同

  • Node.js在child_process域和错误冒泡及捕获实践

    目录 child_process options.detached cipher.update 错误的冒泡和捕获 child_process child_进程模块提供派生子进程的功能.它与popen(3)相似但不相同.此函数主要由[child_process.spown()]函数提供: const { spawn } = require('child_process'); const ls = spawn('ls', ['-lh', '/usr']); ls.stdout.on('data',

  • 详解从Node.js的child_process模块来学习父子进程之间的通信

    child_process模块提供了和popen(3)一样的方式来产生自进程,这个功能主要是通过child_process.spawn函数来提供的: const spawn = require('child_process').spawn; const ls = spawn('ls', ['-lh', '/usr']); ls.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); ls.stderr.on('data'

  • Node.js中child_process实现多进程

    复制代码 代码如下: var http = require('http'); function fib (n) {     if (n < 2) {         return 1;     } else {         return fib(n - 2) + fib(n - 1);     } } var server = http.createServer(function (req, res) {     var num = parseInt(req.url.substring(1)

  • NODE.JS跨域问题的完美解决方案

    这几天公司同事(前端)写页面的时候一直说拿不到想要的JSON,安卓iOS那边是可以拿到的,但他也是新手也不知道为什么只知道是js跨域问题,然后问我我也不懂前端我开始百度, 有人说是谷歌浏览器跨域要设置一下,然后我就在谷歌浏览器的目标后面加一个 --disable-web-security 但是后来发现依然报错,依然拿不到想要的数据.后来也不停的找找找也没有什么眉目. 直到今天百度了一下PHP的跨域启发了我,于是百度找到了node.js的跨域问题,最后我在 app.js 路由设置里面加了一段跨域代

  • 总结Node.js中的一些错误类型

    前言 Node.js应用中可能会发生多种类型的错误.如:当出现语法错误或运行时错误时,会触发JavaScript错误:当试图试访问一个不存在或没有访问的文件时,会触发系统错误:除JavaScript错误和系统错误错误外,用户还可以自定义错误. 1. 错误分类 Node.js是一个JavaScript运行时平台,其应用发生错误都是一个Error实例或Error子类的实例. 在Node.js应用中,可能发生的错误有以下4类: 1.标准JavaScript错误,如: <EvalError> : 当调

  • Node.js中的child_process模块详解

    前言 本文主要给大家介绍了关于Node.js中child_process模块的相关内容,在介绍child_process模块之前,先来看一个例子. const http = require('http'); const longComputation = () => { let sum = 0; for (let i = 0; i < 1e10; i++) { sum += i; }; return sum; }; const server = http.createServer(); ser

  • Linux系统中利用node.js提取Word(doc/docx)及PDF文本的内容

    前言 想要做全文搜索引擎,则需要将word/pdf等文档内容提取出来.对于pdf有xpdf等一些开源方案. 但Word文档的情况则会复杂一些. 提取PDF文本内容 XPDF是一个免费开源的软件,用于显示PDF文件,并可将pdf转换成文字图片等,同样支持Windows版.在Debian Linux上安装非常简单: apt-get install xpdf 我们这里只使用pdftotext这个功能,直接输入可查看帮助: root@raspberrypi:/var/www# pdftotext pdf

  • 浅谈Node.js 子进程与应用场景

    背景 由于ons(阿里云 RocketMQ 包)基于 C艹 封装而来,不支持单一进程内实例化多个生产者与消费者,为了解决这一问题,使用了 Node.js 子进程. 在使用的过程中碰到的坑 发布:进程管理关闭主进程后,子进程变为操作系统进程(pid 为 1) 几种解决方案 将子进程看做独立运行的进程,记录 pid,发布时进程管理关闭主进程同时关闭子进程 主进程监听关闭事件,主动关闭从属于自己的子进程 子进程种类 spawn:执行命令 exec:执行命令(新建 shell) execFile:执行文

  • 浅谈Node.js 沙箱环境

    node官方文档里提到node的vm模块可以用来做沙箱环境执行代码,对代码的上下文环境做隔离. \A common use case is to run the code in a sandboxed environment. The sandboxed code uses a different V8 Context, meaning that it has a different global object than the rest of the code. 先看一个例子 const vm

  • Node.js服务Docker容器化应用实践小结

    本篇不会讲解 Docker 命令的使用.安装等,因为在之前一篇文章一文零基础教你学会 Docker 入门到实践中也已经讲解的很详细了,不清楚的可以点击链接回头在重新看下,本篇重点是介绍 Node.js 项目如何进行 Docker 容器化及一些实践优化,还有一些常见的问题,当然如果还有其它使用上的问题也欢迎大家在评论区进行留言补充. 作者简介:五月君,Nodejs Developer,热爱技术.喜欢分享的 90 后青年,公众号「Nodejs技术栈」,Github 开源项目 www.nodejs.r

随机推荐