1.分享 10 道 Nodejs 进程相关面试题
2.Node.js Stream(流) 简单易懂全解析
3.Node js,源码 Pipe 用法
4.在Node.js中流式处理大JSON文件
5.node.js如何下载
6.nodejs深入学习系列之libuv基础篇(一)
分享 10 道 Nodejs 进程相关面试题
通过对以下 个面试题的分享,助您更好的解析理解 Node.js 的进程和线程相关知识
什么是进程和线程?之间的区别?关于线程和进程是服务端一个很基础的概念,在文章 Node.js进阶之进程与线程 中介绍了进程与线程的源码概念之后又给出了在 Node.js 中的进程和线程的实际应用,对于这块不是解析很理解的建议先看下。
什么是源码孤儿进程?父进程创建子进程之后,父进程退出了,解析网站精品导航源码但是源码父进程对应的一个或多个子进程还在运行,这些子进程会被系统的解析 init 进程收养,对应的源码进程 ppid 为 1,这就是解析孤儿进程。通过以下代码示例说明。源码
创建多进程时,解析代码里有app.listen(port) 在进行 fork 时,源码为什么没有报端口被占用?先看下端口被占用的解析情况以上代码示例,控制台执行node master.js 只有一个 worker 可以监听到 端口,源码其余将会抛出 Error: listen EADDRINUSE ::: 错误那么多进程模式下怎么实现多端口监听呢?答案还是focussns源码有的,通过句柄传递 Node.js v0.5.9 版本之后支持进程间可发送句柄功能,怎么发送?如下所示:
什么是 IPC 通信,如何建立 IPC 通信?什么场景下需要用到 IPC 通信?IPC (Inter-process communication) ,即进程间通信技术,由于每个进程创建之后都有自己的独立地址空间,实现 IPC 的目的就是为了进程之间资源共享访问,实现 IPC 的方式有多种:管道、消息队列、信号量、Domain Socket,Node.js 通过 pipe 来实现。
Node.js 是单线程还是多线程?进一步会提问为什么是单线程?第一个问题,Node.js 是单线程还是多线程?这个问题是个基本的问题,在以往面试中偶尔提到还是有不知道的,Javascript 是源码 src单线程的,但是做为其在服务端运行环境的 Node.js 并非是单线程的。
关于守护进程,是什么、为什么、怎么编写?守护进程运行在后台不受终端的影响,什么意思呢?Node.js 开发的同学们可能熟悉,当我们打开终端执行node app.js 开启一个服务进程之后,这个终端就会一直被占用,如果关掉终端,服务就会断掉,即前台运行模式。如果采用守护进程进程方式,这个终端我执行 node app.js 开启一个服务进程之后,我还可以在这个终端上做些别的事情,且不会相互影响。tachyon 源码
如何让一个 js 文件在 Linux 下成为一个可执行命令程序? 终端测试
进程的当前工作目录是什么? 有什么作用? 进程的当前工作目录可以通过 process.cwd() 命令获取,默认为当前启动的目录,如果是创建子进程则继承于父进程的目录,可通过 process.chdir() 命令重置,例如通过 spawn 命令创建的子进程可以指定 cwd 选项设置子进程的工作目录。
多进程或多个 Web 服务之间的状态共享问题?多进程模式下各个进程之间是相互独立的,例如用户登陆之后 session 的保存,如果保存在服务进程里,那么如果我有 4 个工作进程,每个进程都要保存一份这是没必要的,假设服务重启了数据也会丢失。多个 Web 服务也是一样的,还会出现我在 A 机器上创建了 Session,当负载均衡分发到 B 机器上之后还需要在创建一份。一般的pomelo源码做法是通过 Redis 或者 数据库来做数据共享。
Node.js Stream(流) 简单易懂全解析
在Node.js环境中,流是一种至关重要的抽象数据结构,它简化了数据处理过程。流的概念类似于数据的流动,通过它们,可以高效地在服务器和客户端之间传输数据。例如,当你向/images/1.gif" //request('/images/1.gif').pipe(fs.createWriteStream('/public/upload/downImg/logonew.png')); var req = http.get(url, function (res) { var imgData = "" res.setEncoding("binary"); //一定要设置response的编码为binary否则会下载下来的打不开 res.on("data" function (chunk) { imgData += chunk; }); res.on("end" function () { fs.writeFile("/public/upload/downImg/logonew.png" imgData, "binary" function (err) { if (err) { console.log("保存失败"); } console.log("保存成功"); }); }); res.on("error" function (err) { console.log("请求失败"); }); }); req.on('error' function (err) { console.log("请求失败2" + err.message); }); res.render('index' { title: '首页2'});});module.exports = router;
nodejs深入学习系列之libuv基础篇(一)
本文深入探讨libuv基础概念与实践,旨在帮助开发者全面理解libuv这一强大的异步IO库。首先,我们介绍了libuv的编译方式与简单使用方法,提供了入门级示例帮助开发者快速上手。
接下来,我们深入讲解了libuv的关键概念。首先,了解了事件循环线程,这是libuv的核心机制之一,负责管理所有异步操作。接着,我们详细介绍了句柄(Handle)的概念,包括初始化、长生命周期特点以及libuv提供的各种句柄类型,如uv_timer_t、uv_idle_t、uv_prepare_t、uv_check_t、uv_async_t、uv_poll_t、uv_signal_t、uv_process_t、uv_stream_t、uv_tcp_t、uv_pipe_t、uv_tty_t、uv_udp_t、uv_fs_event_t与uv_fs_poll_t等。我们逐一解析了各句柄的用途与实现原理,并通过实例代码展示其应用。
在理解句柄的基础上,我们引入了request概念,它与句柄协同工作,用于执行特定操作,如关闭连接等。我们还附上了一张思维导图,清晰展示了libuv中句柄与request之间的关系与使用方法。
最后,我们概述了libuv的三种运行模式,强调了灵活运用这三种模式的重要性。本篇内容较为丰富,若想深入了解libuv,建议阅读后续深入学习系列文章或自行实践相关示例代码。
Nest.js 实战 (四):利用 Pipe 管道实现数据验证和转换
管道(Pipelines)在Nest.js中扮演着关键角色,预处理控制器方法接收到的请求数据,包括请求体、查询参数和路径参数。管道允许开发者在数据抵达控制器方法前执行转换、验证、清理或其他预处理任务,确保应用的健壮性、维护性和一致性。
Nest.js内置了九个开箱即用的管道,用于简化数据处理流程。此外,开发者还可以自定义管道以满足特定需求。自定义管道涉及三个步骤:安装依赖、创建pipe文件(例如validation.pipe.ts)和在main.ts中全局注册。
管道测试展示了其功能强大性。例如,当提交添加岗位接口请求体时,若缺少关键参数,会立即提示错误。查询岗位详情接口中,使用ParseUUIDPipe内置管道确保ID为UUID格式,不合规时管道会给出错误信息。这些实例展示了自定义管道和ParseUUIDPipe的用法,其他内置管道的使用方式同样遵循此原则。
管道不仅简化了数据处理,还显著提升了应用的健壮性和安全性。合理利用管道,开发者能专注于业务逻辑实现,无需过多关注底层数据处理细节,从而加速开发周期、提高软件质量。